Django 1.3 Web Developmentをフォローしています。ログインの場合、次のエラーが表示されます。
Forbidden (403)
CSRF verification failed. Request aborted.
Help
Reason given for failure:
CSRF token missing or incorrect.
これは私のsettings.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)),
)
そして、私のregistration/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>
私は何が欠けていますか?
{% csrf_token %}
テンプレートタグを、Django=テンプレートのform
要素の子として追加する必要があります。
このようにして、テンプレートはCSRFトークンに設定された値を持つ非表示要素をレンダリングします。 Djangoサーバーがフォームリクエストを受け取ると、Djangoはトークンがフォームでレンダリングされた値と一致することを確認します。これは、 POSTリクエスト(データ変更リクエスト)は、本物のクライアントセッションから発信されます。
詳細については、Djangoドキュメントを参照してください: https://docs.djangoproject.com/en/dev/ref/csrf/
クロスサイトリクエストフォージェリー攻撃の概要は次のとおりです。 https://www.owasp.org/index.php/CSRF
csrf_token
テンプレートタグを使用しても何も変更しない場合は、CSRF_COOKIE_DOMAIN
設定を確認してください。開発環境でNone
に設定する必要があります。
同じ問題がありました。 {%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>
トピックに関する追加情報を提供したかっただけです。それがあなたに起こって、トークンがフォームに注入され、ビュー関数がすべてを適切に処理していると確信しているが、問題が解決しない場合。入力フィールドを無効にするjavascriptコードがないことを確認してください。数時間のデバッグの後、私は偶然に気付きました。
<input type="hidden" name="csrfmiddlewaretoken" value="pHK2CZzBB323BM2Nq7DE2sxnQoBG1jPl" disabled="">
{% csrf_token %}
フォーム内。これは私のために働いた。それでは、なぜクロスサイトでリクエストされた偽造を使用するのでしょうか?
答えは非常に簡単です。Webページに別のセキュリティレイヤーを追加しただけなので、悪意のあるユーザーは間違ったトークンを使用してリクエストを検証できません。