2011-03-31 17 views
6

डीजेंगो दस्तावेज के अनुसार, 1.3 में AJAX पोस्ट अनुरोध (कम से कम Jquery के साथ) के लिए, हमें केवल यह snippet मुख्य जेएस फ़ाइल में जोड़ने की आवश्यकता है। यह स्निपेट कुकीज़ से csrftoken मिलता है, और फिर इसे सभी AJAX अनुरोध के लिए सेट अप करें। यह काम है, लेकिन क्या होगा अगर csrftoken कुकीज़ में मौजूद नहीं है? मैंने सोचा कि render_to_response और सत्रों में csrftoken अगर स्वचालित रूप से दोनों प्रस्तुत करता है, और टोकन नहीं है, तो इसे हमारे लिए सेट करें। लेकिन वे नहीं हैं। तो, मुझे इसे अपने आप लागू करने की ज़रूरत है? या शायद AJAX csrf सुरक्षा को संभालने का एक और तरीका है?Django में अजाक्स सीएसआरएफ समस्या 1.3

उत्तर

3

आपकी कुकी केवल, CSRF टोकन में शामिल होंगे, तो या तो टेम्पलेट टैग {% csrf_token %} टेम्पलेट में इस्तेमाल किया गया था अनुरोध उत्पन्न करने के लिए, या यदि आप get_token फोन django.middleware.csrf से (तर्क के रूप में request वस्तु के साथ)।

get_token फ़ंक्शन request ऑब्जेक्ट पर मेटाफॉर्मेशन सेट करता है जो बदले में कुकी सेट करने के लिए django.middleware.csrf.CsrfViewMiddleware मिडलवेयर बताता है।

3

अजाक्स के लिए, आपको प्रत्येक अनुरोध के साथ सीएसआरएफ टोकन पास करना चाहिए।

$.ajaxPrefilter(function(options, originalOptions, jqXHR) { 
    if(!options.crossDomain) { 
     if(options.data) { 
      options.data += "&"; 
     } else { 
      options.data = ""; 
     } 
     options.data += "csrfmiddlewaretoken={{csrf_token}}"; 
    } 
}); 
11

जब एक पृष्ठ है कि पहले से ही {% csrf_token%} का उपयोग करने पर कोई रूप नहीं है, कुकी नहीं भेजी जाएगी: jQuery के लिए, मैं निम्नलिखित कोड का उपयोग करें। इसलिए, जैसा कि आपने नोट किया है, आप इस पृष्ठ पर अजाक्स का उपयोग करने का प्रयास करते समय एक त्रुटि प्राप्त करेंगे। यदि आपके पास फॉर्म और AJAX पोस्ट के विभिन्न संयोजनों वाले पृष्ठों के मिश्रण के साथ साइट है, तो यह अनियमित व्यवहार का कारण बन जाएगा।

यह पहले से ही सूचित किया गया है और तय: https://code.djangoproject.com/ticket/15354

पैच में समाधान, होगा 1.3.1 के साथ शुरू करना चाहिए, ensure_cookie_csrf डेकोरेटर है। वह सजावट 1.3 या 1.2.5

में मौजूद नहीं है, हालांकि प्रतीक्षा करने की कोई आवश्यकता नहीं है। बस किसी भी दृश्य जो AJAX के पदों में शामिल है एक CSRF प्रपत्र को यह पंक्ति जोड़ें:

request.META["CSRF_COOKIE_USED"] = True 

उदाहरण:

def calculator(request): 
    request.META["CSRF_COOKIE_USED"] = True 
    return render_to_response('calc.html', {'form': CalcForm()}) 

FYI करें - यह वास्तव में क्या है कि डेकोरेटर करता है।

+0

[सीएसआरएफ Django दस्तावेज़ीकरण] के अनुसार (https: // docs.djangoproject.com/en/dev/ref/contrib/csrf/#django.views।decorators.csrf.ensure_csrf_cookie), sure_cookie_csrf सजावट Django 1.4 के लिए नया है। –

+1

यूप, sure_csrf_cookie सजावट Django 1.4 में उतरा। दुर्भाग्य से 1.3.1 में नहीं – bjunix

1

एक तरीका जिस तरह से मुझे यह पता चला है कि यह आपके AJAX डेटा के लिए स्टार्टर पॉइंट के रूप में एक पूर्ववर्ती रूप का उपयोग कर रहा है।

<form id="ajax_form" stye="display: none;">{% csrf_token %}</form> 

तो फिर तुम JQuery के क्रमानुसार समारोह के माध्यम से अपने जावास्क्रिप्ट में इस का उपयोग कर सकते हैं:

var data = $('#ajax_form').serialize(); 
data += "&mydata=69"; 

तुम भी है कि गुप्त फ़ॉर्म के भीतर छिपे फ़ील्ड का उपयोग कर सकते हैं, ताकि आप स्ट्रिंग संयोजन का उपयोग करने के लिए बनाया की जरूरत नहीं है आपका पोस्ट डेटा

1

यदि आप @csrf_protect सजावट का उपयोग कर रहे हैं, तो सुनिश्चित करें कि फ़ॉर्म के साथ दोनों दृश्य और दृश्य को सजावटी का उपयोग करने के लिए डेटा पोस्ट किया जा रहा है।

मुझे एक समान समस्या थी। मेरे पास केवल पोस्ट व्यू पर @csrf_protect था, जिसने स्थानीय स्तर पर ठीक परीक्षण किया था, लेकिन जब मैं लाइव गया तो मुझे 403 सत्यापन मिला, जिसमें सजावटी को जोड़ दिया गया था, पेज व्यू को

संबंधित मुद्दे