2013-04-26 9 views
9

मैं बोतल क्रॉस-साइट स्क्रिप्टिंग ठीक से संभाल पाने के लिए कोशिश कर रहा हूँ के लिए काम नहीं करता। मैंने यहां से क्रॉसडोमेन डेकोरेटर स्निपेट लिया है: http://flask.pocoo.org/snippets/56/अजगर बोतल पार साइट HTTP POST - विशिष्ट अनुमति मूल

नीचे दिए गए कोड में, मैंने सजावटी स्निपेट और मूल फ्लास्क सर्वर रखा है।

मैं सजावटकर्ता को हेडर = 'सामग्री-प्रकार' के साथ बुला रहा हूं क्योंकि अन्यथा मुझे "हेडर फ़ील्ड का अनुरोध प्राप्त हो रहा था सामग्री-प्रकार को एक्सेस-कंट्रोल-स्वीकृति-हेडर द्वारा अनुमति नहीं है।" ब्राउज़र में के रूप में-है, काम करता है नीचे कोड:

तो यहाँ मेरे सवाल है। लेकिन जब मैं केवल एक विशिष्ट सर्वर की तरह इतना करने के लिए प्रतिबंधित करना चाहते हैं:

@crossdomain(origin='myserver.com', headers='Content-Type') 

मैं ब्राउज़र त्रुटि

मिल "उत्पत्ति http://myserver.com पहुंच-नियंत्रण-अनुमति दें-उत्पत्ति से अनुमति नहीं है।"

मैं इसे मूल की तुलना में = और कुछ के लिए काम नहीं मिल सकता है '*'।

क्या किसी के पास कोई विचार है?

from datetime import timedelta 
from flask import make_response, request, current_app, Flask, jsonify 
from functools import update_wrapper 

def crossdomain(origin=None, methods=None, headers=None, 
      max_age=21600, attach_to_all=True, 
      automatic_options=True): 
    if methods is not None: 
     methods = ', '.join(sorted(x.upper() for x in methods)) 
    if headers is not None and not isinstance(headers, basestring): 
     headers = ', '.join(x.upper() for x in headers) 
    if not isinstance(origin, basestring): 
     origin = ', '.join(origin) 
    if isinstance(max_age, timedelta): 
     max_age = max_age.total_seconds() 

    def get_methods(): 
     if methods is not None: 
      return methods 

     options_resp = current_app.make_default_options_response() 
     return options_resp.headers['allow'] 

    def decorator(f): 
     def wrapped_function(*args, **kwargs): 
      if automatic_options and request.method == 'OPTIONS': 
      resp = current_app.make_default_options_response() 
      else: 
       resp = make_response(f(*args, **kwargs)) 
      if not attach_to_all and request.method != 'OPTIONS': 
       return resp 

      h = resp.headers 

      h['Access-Control-Allow-Origin'] = origin 
      h['Access-Control-Allow-Methods'] = get_methods() 
      h['Access-Control-Max-Age'] = str(max_age) 
      if headers is not None: 
       h['Access-Control-Allow-Headers'] = headers 
      return resp 

     f.provide_automatic_options = False 
     return update_wrapper(wrapped_function, f) 
    return decorator 

app = Flask(__name__) 

@app.route('/my_service', methods=['POST', 'OPTIONS']) 
@crossdomain(origin='*', headers='Content-Type') 
def my_service(): 
    return jsonify(foo='cross domain ftw') 

if __name__ == '__main__': 
    app.run(host="0.0.0.0", port=8080, debug=True) 

संदर्भ के लिए मेरी अजगर संस्करण 2.7.2 बोतल संस्करण 0.7.2

उत्तर

2

मैं सिर्फ अजगर संस्करण 2.7.3 के साथ एक ही कोड की कोशिश की और जाता है:

यहाँ पूरा कोड है फ्लास्क संस्करण 0.8।

इन संस्करणों के साथ, यह

@crossdomain(origin='myserver.com', headers='Content-Type') 

के साथ विफल हो लेकिन यह

@crossdomain(origin='http://myserver.com', headers='Content-Type') 

साथ काम करता है शायद यह सिर्फ बोतल 0.7.2 के साथ काम नहीं करता है? (स्निपेट पेज पर जो भी कहता है उसके बावजूद)।


संपादित करें: इस एक बहुत अधिक (और उन्नयन कुप्पी 0.9) के साथ खेलने के बाद ऐसा लगता है कि वास्तविक समस्या (या अभी तक एक और समस्या) एक सूची में एक से अधिक की अनुमति दी मूल के होने से संबंधित हो सकता है। दूसरे शब्दों में, इस तरह से ऊपर कोड का उपयोग:

@crossdomain(origin=['http://myserver.com', 'http://myserver2.com'], headers='Content-Type') 

काम नहीं करता।

इस समस्या को मैं डेकोरेटर बदलाव ठीक करने के लिए। यहां कोड देखें: http://chopapp.com/#351l7gc3

यह कोड केवल सूची में होने पर अनुरोध करने वाले साइट का डोमेन लौटाता है। किंडा विचित्र, लेकिन कम से कम मेरे लिए, समस्या हल हो :)

+0

नहीं कर सकते कोड – martriay

+0

यह वहाँ देखते हैं, लेकिन किसी कारण से लोड करने के लिए कुछ समय लग रहा। – Nate

+0

अपना कोड पुन: अनुरोध करें कि request.headers ['उत्पत्ति'] कोई नहीं हो सकता है, और 'इन' ऑपरेटर बाएं तर्क के रूप में कोई नहीं ले सकता है। अन्यथा, धन्यवाद :-) –

0

अजगर क्रॉस साइट स्क्रिप्टिंग हमलों के लिए अपने आप को उजागर करने से रोकने के लिए कड़ी मेहनत कर रहा है।

एक दुविधा में दे रही है, और आपके अनुरोध एक ही सर्वर कुप्पी स्क्रिप्ट पर चल रहा है हिट होने से है।तारों में परिभाषित दूर दूर सर्वर से जेएसओएन प्राप्त करना वैसे भी जोखिम भरा व्यवसाय है।

मैं ब्राउज़र दे एक ही सर्वर पर ही रखने के लिए, इस तरह से इसे ठीक करने में सक्षम था:

$('a#calculate').bind('click', function() { 
    $.getJSON('/_add_numbers', { 
    a: $('input[name="a"]').val(), 
    b: $('input[name="b"]').val() 
    }, function(data) { 
    $("#result").text(data.request); 
    }); 
    return false; 
}); 

सूचना कैसे getJSON विधि एक /_add_numbers पारित कर दिया है। यह ब्राउज़र को उसी मेजबान पर रहने और उस पृष्ठ को देखने के लिए संचार करता है। इसके बाद ब्राउज़र को खुश है और सुरक्षित हम एक ही मेजबान पर रह रहे हैं, और आप त्रुटि कभी नहीं मिल:

Origin http://myserver.com is not allowed by Access-Control-Allow-Origin