【问题标题】:Different value of csrf token in response header and browser cookies. csrf verification failing in django 1.9响应标头和浏览器 cookie 中的不同值的 csrf 令牌。 django 1.9 中的 csrf 验证失败
【发布时间】:2017-06-06 20:04:09
【问题描述】:

大多数 SO 答案都要求清除 cookie 并确认中间件类。我已经试过了。

Python - 3.4
Django - 1.10
使用虚拟环境。

我在 Django 管理员登录屏幕上收到 Forbidden (403) CSRF verification failed. Request aborted. 错误。我使用 django version 1.9 在 pythonanywhere.com 上托管了我的网站。

  • 我已清除浏览器 cookie。全部。
  • 我重新加载了登录屏幕。获取请求。
  • 在浏览器 cookie 中,到目前为止都是空的,为我的网站设置了一个值,其中 csrf 值为 = XPp5hAhylAkt27U4SzGPNU7w8SFBJ3RP
  • 在响应标头中,设置的 cookie 使用 cookie 值 = UT24544MghHLZi0IrGHQlCcpk1v0SbCy 发送。表单的源代码中提供了相同的值。
  • 现在我输入了用户名和密码,然后点击登录按钮。
  • 收到 403 错误 CSRF 验证失败。请求中止。
  • 我重新检查了csrf token的所有值。
  • 在请求标头中 CSRF cookie 值 = XPp5hAhylAkt27U4SzGPNU7w8SFBJ3RP
  • 在表单数据 csrf 值 = UT24544MghHLZi0IrGHQlCcpk1v0SbCy

  • 我已经在中间件类中有“django.middleware.csrf.CsrfViewMiddleware”。我清除了浏览器缓存和 cookie。甚至重启了系统。

我在不同的网站上使用了完全相同的代码,它工作得很好。

为什么有不同的 csrf-token 值?这个问题的解决方法是什么?

更新 1:如果我在设置中设置 debug = False,它工作正常。但我不能保留它,因为代码是实时的。

更新 2:经过进一步调查,我发现浏览器 cookie csrftoken 的值未设置为响应标头中传递的正确值。如果我从浏览器中删除 cookie,然后从控制台将其设置为正确的值,则发布请求将起作用。

更新 3:现在,我在我的网络应用程序上执行的每个帖子请求或表单提交都会发生同样的问题。响应头和源代码中发送的 CSRF 令牌值与浏览器 cookie 中设置的值不同。

更新 4:设置 CSRF_COOKIE_NAME = "csrf_token" 也没有帮助。

【问题讨论】:

  • 您是否真的将 CSRF 令牌放入您的表单中?
  • 嗨,Glen,这是管理模块,所以在管理模块中创建的任何表单都必须有 csrf 令牌。
  • 您是否将 CSRF_COOKIE_SECURE 设置为 True ?
  • @zxzak :不,我没有。默认为假。
  • 阅读所有关于 {{ csrf_token }} docs.djangoproject.com/en/1.10/ref/csrf

标签: django cookies django-admin


【解决方案1】:

当浏览器尝试获取 favicon 时,设置了 CSRF 令牌的意外值。

您为网站图标定义的 URL 似乎无效,显然,不存在的 URL 由您的默认视图处理。这会设置一个不同的 CSRF cookie,但在浏览器中显示的页面仍然具有表单中的初始 CSRF 令牌。

请求加载页面:

请求加载网站图标:

您可以通过确保网站图标存在来修复此特定错误。

请注意,只要您链接的任何资源(例如图像)不存在,此错误就会再次出现,因为您的应用会呈现主页而不是返回 404 错误。

【讨论】:

  • 非常感谢丹尼尔。我正在使用主页视图来处理输入错误的网址。是否有可能在有人输入错误的 url 时加载主页,但在找不到图像时忽略。
  • 一个好的解决方案取决于您如何实现该回退。最好为此提出一个新问题。作为一种解决方法,如果 request.path/static/ 开头并返回 404 响应,您可以检查您的 HomePage 视图。
  • 天哪,感谢您发布此信息。几天来,我一直在尝试对这个错误进行排序,这绝对让我难过。不敢相信是这样的事情导致了错误。
  • 我从来没有想过这个!不幸的是,我现在正确设置了网站图标,但仍然出现同样的错误。 :-(
  • @DanielHepper 为什么设置 debug = False 解决了这个问题?
猜你喜欢
  • 2016-11-18
  • 2016-05-29
  • 2014-10-21
  • 2016-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-14
相关资源
最近更新 更多