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 上的主要内容,如果未能解决你的问题,请参考以下文章

Django-ajax:CSRF 验证失败。请求中止

Django CSRF 验证失败。请求中止。错误

错误:“CSRF 验证失败。请求中止。”在 Django 中使用 jquery ajax 时

禁止 (403) CSRF 验证失败。请求中止。即使使用 % csrf_token %

管理面板的 Django CSRF 验证失败

CSRF 验证失败。请求中止。我保留了 ta 标签 % csrf_token % 仍然得到这个