CSRF 验证失败。请求中止。在 django 上
Posted
技术标签:
【中文标题】CSRF 验证失败。请求中止。在 django 上【英文标题】:CSRF verification failed. Request aborted. on django 【发布时间】:2012-03-30 08:39:55 【问题描述】:我正在关注 Django 1.3 Web 开发。对于登录,我收到以下错误
Forbidden (403)
CSRF verification failed. Request aborted.
Help
Reason given for failure:
CSRF token missing or incorrect.
这是我的 settings.py 包含的应用程序。这正是书中所说的。
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 verification
(出于某些原因),this SO post 可能会有用
【参考方案1】:
您需要在 Django 模板中添加 % csrf_token %
模板标签作为 form
元素的子元素。
这样,模板将呈现一个隐藏元素,其值设置为 CSRF 令牌。当 Django 服务器收到表单请求时,Django 将验证令牌是否与表单中呈现的值匹配。这对于确保 POST 请求(即数据更改请求)源自真实的客户端会话是必要的。
有关更多信息,请查看以下 Django 文档: https://docs.djangoproject.com/en/dev/ref/csrf/
以下是跨站点请求伪造攻击的概述: https://www.owasp.org/index.php/CSRF
【讨论】:
【参考方案2】:如果您使用csrf_token
模板标签并且问题没有解决,请检查CSRF_COOKIE_DOMAIN
设置。您应该在开发环境中将其设置为None
。
【讨论】:
检查CSRF_COOKIE_SECURE
,如果你的开发服务器没有ssl。【参考方案3】:
我遇到了同样的问题。我在添加 % 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>
【讨论】:
【参考方案4】:只是想提供有关该主题的更多信息。如果它发生在您身上,并且您确定令牌已注入表单并且视图函数正在正确处理所有内容,但问题仍然存在。确保没有禁用输入字段的 javascript 代码。发生在我身上,经过几个小时的调试,终于意识到了这一点。
<input type="hidden" name="csrfmiddlewaretoken" value="pHK2CZzBB323BM2Nq7DE2sxnQoBG1jPl" disabled="">
【讨论】:
好点;提交表单时,disabled
表单元素的值不会发送到服务器。【参考方案5】:
在 Django 4.0 中,设置 CSRF_TRUSTED_ORIGINS
也很重要。
见here
【讨论】:
【参考方案6】:% csrf_token %
在您的表单中。这对我有用。那么我们为什么要使用跨站请求伪造呢?
嗯,答案很简单,它只是为您的网页添加了另一个安全层,因此任何恶意用户都无法使用错误的令牌验证请求。
【讨论】:
【参考方案7】:在您的模板中 form 标签之后,您必须并且应该将 CSRF 令牌以 jing 格式放在您的模板上。例如 % csrf_token %。
在任何使用 POST 表单的模板中,在元素内使用 csrf_token 标记。如果您不想使用 csrf_token,则可以从主应用的设置文件中禁用它。
对于您的模板,只需使用
<form method="post" action=".">
% csrf_token %
//followed by rest of the tags
</form>
【讨论】:
以上是关于CSRF 验证失败。请求中止。在 django 上的主要内容,如果未能解决你的问题,请参考以下文章
错误:“CSRF 验证失败。请求中止。”在 Django 中使用 jquery ajax 时