为啥 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 错误?的主要内容,如果未能解决你的问题,请参考以下文章
Django Admin登录403 Forbidden(未设置CSRF cookie。)