我正在关注Django 1.3 Web开发。并且对于登录,我收到以下错误
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)),
)
和我的注册/ 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>
我错过了什么?
答案 0 :(得分:57)
您需要将{% csrf_token %}
模板标记添加为Django模板中form
元素的子元素。
这样,模板将呈现一个隐藏元素,其值设置为CSRF令牌。当Django服务器收到表单请求时,Django将验证该令牌是否与表单中呈现的值匹配。这对于确保POST请求(即数据更改请求)来自可靠的客户端会话是必要的。
有关详细信息,请查看Django文档: https://docs.djangoproject.com/en/dev/ref/csrf/
以下是跨站点请求伪造攻击的概述: https://www.owasp.org/index.php/CSRF
答案 1 :(得分:8)
如果您使用csrf_token
模板标记但未更改任何内容,请检查CSRF_COOKIE_DOMAIN
设置。您应该在开发环境中将None
设置为它。
答案 2 :(得分:7)
我遇到了同样的问题。当我添加{%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>
答案 3 :(得分:4)
只是想提供有关该主题的其他信息。如果它发生在您身上并且您确定令牌已在表单中注入并且视图函数正在正确处理所有内容但问题仍然存在。确保没有禁用输入字段的JavaScript代码。经过几个小时的调试,发生在我身上,终于意识到了这一点。
<input type="hidden" name="csrfmiddlewaretoken" value="pHK2CZzBB323BM2Nq7DE2sxnQoBG1jPl" disabled="">
答案 4 :(得分:0)
{% csrf_token %}
在表单内。这对我有用。那么为什么我们要使用Cross-site请求伪造?
嗯,答案非常简单,它只是在您的网页上添加了另一个安全层,任何恶意用户都无法使用错误的令牌验证请求。
答案 5 :(得分:0)
在表单标签之后的模板中,您必须并且应该将 CSRF 令牌以 jing 格式放置在模板上。例如 {% csrf_token %}。
在任何使用 POST 表单的模板中,请在元素内使用 csrf_token 标记。如果您不想使用 csrf_token,则可以从主应用的设置文件中禁用它。
对于您的模板,只需使用
<form method="post" action=".">
{% csrf_token %}
//followed by rest of the tags
</form>