2012-03-13 16 views
31

पर मैं Django 1.3 वेब विकास का अनुसरण कर रहा हूं। और लॉग इन के लिए, मुझे निम्न त्रुटि मिल रही हैसीएसआरएफ सत्यापन विफल रहा। अनुरोध निरस्त django

Forbidden (403) 
CSRF verification failed. Request aborted. 
Help 
Reason given for failure: 
    CSRF token missing or incorrect. 

यह मेरी सेटिंग्स.py शामिल APPS है। यह बिल्कुल ठीक है कि किताब कहती है कि यह होना चाहिए।

INSTALLED_APPS = (
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.sites', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
    # Uncomment the next line to enable the admin: 
    'django.contrib.admin', 
    # Uncomment the next line to enable admin documentation: 
    # 'django.contrib.admindocs', 
    'djangocricket.Cricket', 
    'djangocricket.cms' 
) 

किताब कहते हैं, यह शामिल करना चाहिए, django.contrib.auth.views.login .. और मैं

urlpatterns = patterns('', 
    # Examples: 
    url(r'^$', 'djangocricket.Cricket.views.index', name='default'), 
    url(r'^user/(\w+)/$', 'djangocricket.Cricket.views.user_home', name='user home'), 
    url(r'^login/$', 'django.contrib.auth.views.login'), 
    # url(r'^djangocricket/', include('djangocricket.foo.urls')), 

    # Uncomment the admin/doc line below to enable admin documentation: 
    #url(r'^admin/doc/', include('django.contrib.admindocs.urls')), 

    # Uncomment the next line to enable the admin: 
    url(r'^news/', 'djangocricket.cms.views.index', name='index'), 
    #url(r'^news/(?P<slug>[^\.]+).html', 'djangocricket.cms.views.detail', name='get_single_news_item'), 
    url(r'^admin/', include(admin.site.urls)), 
) 

और मेरी पंजीकरण/login.html ... कॉपी में यह शामिल कर रहा हूँ पुस्तक से चिपकाया। यह करना चाहिए।

<html> 
<head> 
    <title>Django Bookmarks - User Login</title> 
</head> 
<h1>User Login</h1> 
{% if form.errors %} 
    <p>Your username and password didn't match. 
     Please try again.</p> 
{% endif %} 
<form method="post" action="."> 
    <p><label for="id_username">Username:</label> 
     {{ form.username }}</p> 
    <p><label for="id_password">Password:</label> 
     {{ form.password }}</p> 
    <input type="hidden" name="next" value="/" /> 
    <input type="submit" value="login" /> 
</form> 
</body> 
</html> 

मुझे क्या याद आ रही है?

उत्तर

52

आपको अपने Django टेम्पलेट में form तत्व के बच्चे के रूप में {% csrf_token %} टेम्पलेट टैग जोड़ने की आवश्यकता है।

इस प्रकार, टेम्पलेट सीएसआरएफ टोकन के मूल्य सेट के साथ एक छिपा तत्व प्रस्तुत करेगा। जब Django सर्वर फॉर्म अनुरोध प्राप्त करता है, तो Django सत्यापित करेगा कि टोकन फॉर्म में प्रदान किए गए मान से मेल खाता है। यह सुनिश्चित करना आवश्यक है कि POST अनुरोध (यानी डेटा-परिवर्तन अनुरोध) एक प्रामाणिक ग्राहक सत्र से उत्पन्न होते हैं।

अधिक जानकारी के लिए, पर Django प्रलेखन की जाँच करें: https://docs.djangoproject.com/en/dev/ref/csrf/

यहाँ क्रॉस साइट अनुरोध जालसाजी का दौरा पड़ने से एक सिंहावलोकन है: आप csrf_token टेम्पलेट टैग का उपयोग लेकिन कुछ भी परिवर्तित नहीं हैं https://www.owasp.org/index.php/CSRF

+0

धन्यवाद, यह मदद करता है। – debuggerpk

+3

लिंक –

7

, CSRF_COOKIE_DOMAIN सेटिंग की जांच करें। आपको विकास पर्यावरण पर None सेट करना चाहिए।

+2

लिंक के लिए धन्यवाद 'CSRF_COOKIE_SECURE' भी जांचें यदि आपके dev सर्वर में एसएसएल नहीं है। – Mark

4

बस विषय पर अतिरिक्त जानकारी देना चाहता था। यदि यह कभी आपके साथ होता है और आप सुनिश्चित हैं कि टोकन को फॉर्म में इंजेक्शन दिया गया है और दृश्य फ़ंक्शन ठीक से सबकुछ संभालने में हैं लेकिन समस्या बनी रहती है। सुनिश्चित करें कि इनपुट फ़ील्ड को अक्षम करने वाला कोई जावास्क्रिप्ट कोड नहीं है। कुछ घंटों के डिबगिंग के बाद, मुझे अंत में एहसास हुआ।

<input type="hidden" name="csrfmiddlewaretoken" value="pHK2CZzBB323BM2Nq7DE2sxnQoBG1jPl" disabled=""> 
+0

अच्छा बिंदु; फॉर्म सबमिट होने पर 'अक्षम' फॉर्म तत्वों के मान सर्वर पर नहीं भेजे जाते हैं। –

5

मुझे एक ही समस्या थी। मैंने इस समस्या को हल किया जब मैंने {% csrf_token%} जोड़ा। अंत में मेरा कोड यह है:

<form id='formulario2' method='post' action='> 
     <h3>Enter:</h3> 
     {% csrf_token %} 


    <input id="id_mesaje" name="mesaje" type="email" placeholder="E-mail"/> 
    <input type='submit' name="boton2" value='Suscribete' style="display:inline-block;background-color: #80e174; "/> 
</form> 
0

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

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