2012-03-13 14 views
31

私はDjango 1.3 Web Developmentに従っています。ログインの場合、次のエラーが表示されます。CSRFの確認に失敗しました。リクエストが中止されました。 on Django

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

これは私のsettings.py Included 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

{% csrf_token %}テンプレートタグをform要素の子としてDjangoテンプレートに追加する必要があります。

このようにして、テンプレートは、値がCSRFトークンに設定された隠し要素をレンダリングします。 Djangoサーバーがフォーム要求を受け取ると、Djangoはそのトークンがフォームでレンダリングされた値と一致することを確認します。これは、POST要求(すなわち、データ変更要求)が確実なクライアントセッションから生じることを保証するために必要である。 、あなたはcsrf_tokenテンプレートタグ使用しますが、何も変更しない場合は https://www.owasp.org/index.php/CSRF

+0

ありがとうございます。 – debuggerpk

+3

リンクのためにありがとう –

7

:ここでは、クロスサイトリクエストフォージェリ攻撃の概要です https://docs.djangoproject.com/en/dev/ref/csrf/

は、より多くの情報については、次のDjangoのドキュメントをチェックCSRF_COOKIE_DOMAINの設定を確認してください。開発環境でNoneに設定する必要があります。

+2

devfサーバーにsslがない場合は 'CSRF_COOKIE_SECURE'もチェックしてください。 – Mark

4

トピックに関する追加情報が必要です。あなたに起こったことがあり、トークンがフォームに注入されていて、ビュー関数がすべてを正しく処理しているが、問題が解決されない場合は、入力フィールドを無効にするjavascriptコードがないことを確認してください。何時間ものデバッグの後、私にはやっと起こりました。

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

良い点;フォームが提出されたときに 'disabled'フォーム要素の値はサーバーに送られません。 –

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

こんにちは、単にあなたのform.This内{%csrf_token%}を使う私のために働きました。それで、なぜクロスサイト要求偽造を使用するのですか? 答えはとてもシンプルです。あなたのウェブページに別のセキュリティレイヤーを追加しました。悪質なユーザーは間違ったトークンを使ってリクエストを検証できません。

関連する問題