为啥 Django 管理员登录给我 403 CSRF 错误?

Posted

技术标签:

【中文标题】为啥 Django 管理员登录给我 403 CSRF 错误?【英文标题】:Why is Django admin login giving me 403 CSRF error?为什么 Django 管理员登录给我 403 CSRF 错误? 【发布时间】:2011-04-10 08:17:02 【问题描述】:

我正在运行 Django 1.2.2,当我尝试登录 Django 管理员时收到以下错误:

禁止 (403) CSRF 验证 失败的。请求中止。

失败原因:

没有 CSRF 或会话 cookie。

** 我没有对准系统管理员进行任何自定义,当我检查源代码时,我认为正确位置的表单中有一个 CSRF 令牌。

当我查看正在发送的实际请求时,会发送一个 csrf 令牌,但 Django 仍然说 CSRF 验证失败。

谁能指出我正确的方向?为什么会这样?

【问题讨论】:

昨天不是Django 1.2.2出来了吗? 是的,我修改了我的问题。我今天删除并重新安装了 Django。我在这样做之前得到了错误。我之前用的是 1.2.1。 【参考方案1】:

我在 Django 1.2.1 FINAL 上遇到了同样的问题。因为我知道我们生产站点上的 Django 永远不会从 1.0 更新(由于各种原因),我找到了一个解决方法,我在我的开发版本 settings.py 中实现了,而生产 settings.py 保持不变。

使用以下代码在您的应用程序目录中创建一个 middleware.py 文件:

class disableCSRF:
    def process_request(self, request):
        setattr(request, '_dont_enforce_csrf_checks', True)
        return None

然后在你的 settings.py 开发版本中,将其插入 MIDDLEWARE_CLASSES:

'your_app_name.middleware.disableCSRF',

也许不是最安全的解决方案,但我们的 Django 站点是严格内部的,因此任何类型的恶意行为的风险都最低。这个解决方案很简单,不涉及对模板/视图的更改,并且可以立即工作(与我尝试过的其他解决方案不同)。

希望与我有类似情况的人会发现这很有用。

感谢 John McCollum,我在他的 site 上找到了这个。

【讨论】:

这里的意思是“project”而不是“app”? 当我尝试此解决方案时,它只是在管理员登录时给我一个错误:“看起来您的浏览器未配置为接受 cookie。请启用 cookie,重新加载此页面,然后重试。” 我不得不使用这种方法。出于某种原因,我工作的服务器正在清理 cookie。我们认为这是由于空格造成的,但它仍然抛出错误。感谢这个很酷的解决方案!【参考方案2】:

根据docs,不仅需要csrf隐藏表单域,还需要csrftoken cookie。您提供的错误消息还表明缺少 cookie。

我会查看您浏览器的 cookie 以确保存在 csrftoken cookie。

【讨论】:

我终于发现我只是在 Firefox 中遇到了这个错误。为了纠正这个问题,我进入了我的 Firefox cookie 并删除了所有 django 站点的cookie。一旦浏览器为该站点添加了新的 csrf cookie,它就可以正常工作。一定是过期的 cookie 什么的…… 我在同一个网站上又遇到了这个问题。我上面说的解决方案这次不起作用。 Django 现在甚至没有生成 CSRF cookie。【参考方案3】:

1) 你的settings.MIDDLEWARE_CLASSES 中有'django.middleware.csrf.CsrfViewMiddleware' 吗?

2) 你确定你一直在使用 1.2.2 吗?那是昨晚才出来的……

【讨论】:

是的,我的 MIDDLEWARE_CLASSES 中有它。实际上,直到今天早上我完全重新安装它时,我认为我一直在运行 1.2.1。很好的收获。 如果我检查 Charles 中的请求,我可以看到请求中有一个 csrfmiddlewaretoken。因此,如果正在生成令牌,则 CSRF 正在工作。但是为什么提交表单的时候看不到token呢?

以上是关于为啥 Django 管理员登录给我 403 CSRF 错误?的主要内容,如果未能解决你的问题,请参考以下文章