2011-08-27 15 views
13

संभव डुप्लिकेट:
"CSRF token missing or incorrect" while post parameter via AJAX in DjangoJQuery + AJAX + Django = CSRF?

मैं उपयोगकर्ता को प्रमाणित करने AJAX के द्वारा प्रवेश डेटा भेजना चाहते थे, लेकिन यह CSRF की वजह से संभव नहीं था। क्या आप मुझे बता सकते हैं कि इसे मेरे कोड में जोड़ने के लिए क्या करना है?

मेरी जावास्क्रिप्ट फ़ाइल:

$("#login").live("click", function() { 
    var username = $(".login_username").val(); 
    var password = $(".login_password").val(); 

    $.ajax({ 
     url: "/login", 
     type: "POST", 
     data: { 
      username: username, 
      password: password 
     }, 
     cache: false, 
     success: function(tekst) { 
      alert(tekst); 
     } 
    }); 
}); 
+0

मेरा मानना ​​है कि आप अपना उत्तर [यहां] (https://docs.djangoproject.com/en/dev/ref/contrib/csrf/) पा सकते हैं। सबसे सरल समाधान django उदाहरण पर सीएसआरएफ सुरक्षा को अक्षम करना प्रतीत होता है। अगला सबसे अच्छा विकल्प फॉर्म से django के सीएसआरएफ टोकन को पकड़ने के लिए अपने जावास्क्रिप्ट लॉगिन को अपडेट करना है और इसे AJAX अनुरोध के हिस्से के रूप में शामिल करना है। – aroth

+1

मेरे पिछले जवाब पर एक नज़र डालें। http://stackoverflow.com/questions/6506897/csrf-token-missing-or-incorrect-while-post-parameter-via-ajax-in-django/6533544#6533544 – sigurd

उत्तर

10

एक method explained here नहीं है।

इसमें प्रत्येक AJAX अनुरोध पर एक्स-सीएसआरएफटीकेड हेडर जोड़ने का होता है।

यह jQuery.ajaxSend ईवेंट में हुकिंग करके किया जाता है, इसलिए सबकुछ स्वचालित रूप से किया जाता है (आपको बस अपने कोड को कॉपी और पेस्ट करना होगा, और पहले एजेक्स अनुरोध से पहले इसे चलाएं)।

+0

हाँ, मैंने इसे पढ़ लिया है। लेकिन, मुझे नहीं पता कि इसका उपयोग कैसे करें और इसे कहां जोड़ना है? /? –

+0

कोड को < 'के बाद कोड डालें और यह सब कुछ ऐसा लगता है। – arnaud576875

+0

मैंने '$ (" # लॉगिन ") के अंत के बाद उस कोड को रखा है। लाइव (" क्लिक करें ", फ़ंक्शन() {' फ़ंक्शन - यह कुछ भी नहीं बदला गया है :(। वह कोड अलग फ़ाइल में होना चाहिए? –

3

मैं एक ही समस्या का समाधान करने की कोशिश कर रहा है, और जैसा कि arnaud576875 कहते हैं आप प्रत्येक ajax अनुरोध पर CSRF टोकन शीर्ष लेख जोड़ें Django डॉक्स की तरह कहते हैं https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax और किसी भी Ajax अनुरोध आप कर पहले कि कोड को निष्पादित करने के लिए है।

लेकिन वहाँ कुछ अतिरिक्त है, आप किसी भी AJAX अनुरोध करने के लिए प्रयास करने से पहले अपने अनुप्रयोग के कुकीज़ को CSRF टोकन लोड करने के लिए एक रास्ता खोजने के लिए है, दर्दनाक घंटे का एक बहुत शोध के बाद मैं एक विशिष्ट जवाब नहीं मिल सका ऐसा करने के लिए, मैंने जो पाया, यह सुनिश्चित करने के लिए कि आपका दृश्य एक कुकी के भीतर सीएसआरएफ टोकन भेजता है, आप ensure_csrf_token() का उपयोग प्रत्येक दृश्य में कर सकते हैं जिसे आप टोकन https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#django.views.decorators.csrf.ensure_csrf_cookie प्राप्त करना चाहते हैं, यह बहुत से लोगों के लिए काम करता है, लेकिन मेरे लिए काम नहीं किया

एक और तरीका विरासत विधि का उपयोग कर रहा है, 'django.middleware.csrf.CsrfResponseMiddleware' को अपने MIDDLEWARE_CLASSES में जोड़ रहा है लेकिन मैं इस विधि की अनुशंसा नहीं करता क्योंकि कई सुरक्षा जोखिम छोड़ देता है। https://docs.djangoproject.com/en/1.2/ref/contrib/csrf/#legacy-method

मेरे द्वारा पहले किए गए सभी तरीकों से मेरे लिए काम नहीं किया गया। जिस तरह से है कि मैं अजाक्स कुछ अनुरोध करने की अनुमति कर रहा हूँ निम्नलिखित के रूप में है, और किसी को यह एक खतरनाक विधि पाता है तो कृपया मुझे बताएं: पहली बार देखने को

  1. जाओ कि आपके उपयोगकर्ता की तरह, मारा जाएगा/घर/पृष्ठ
  2. पुनः निर्देशित या कुछ भी request.META["CSRF_COOKIE_USED"] = True

पार्स करने से पहले इस डालें और वह यह, इस तरह है कि मेरे लिए काम करता है, लेकिन जैसा कि मैंने कहा पहले मुझे यकीन है कि अगर यह सही विधि या सबसे सुरक्षित है नहीं कर रहा हूँ एक सीएसआरएफ सुरक्षा को पूरा करने के लिए।