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

为啥 Selenium 会导致 CSRF 403?

Django Admin登录403 Forbidden(未设置CSRF cookie。)

为啥我在 Django 收到 403 POST 请求错误?

django 403 禁止 - 重定向到登录

为啥 Spring Boot 不会重定向到 403 上的 Keycloak 登录页面?

Django Rest Framework在编辑用户时返回403 Forbidden,但在未以任何用户身份登录时工作