响应头和浏览器cookie中csrf令牌的值不同。 django 1.9

时间:2017-01-22 04:12:08

标签: django cookies django-admin

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

Python - 3.4
Django - 1.10
使用VirtualEnv。

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

  • 我已清除浏览器Cookie。所有这些。
  • 我重新加载了登录屏幕。获取请求。
  • 在目前为空的浏览器Cookie中,我的网站设置了一个值,其中csrf值为= XPp5hAhylAkt27U4SzGPNU7w8SFBJ3RP enter image description here
  • 在回复标题中,已设置Cookie,其中Cookie值为UT24544MghHLZi0IrGHQlCcpk1v0SbCy。表单的源代码中提供了相同的值。 enter image description here
  • 现在我输入了用户名和密码,然后点击登录按钮。
  • 收到403错误CSRF验证失败。请求中止。
  • 我重新检查了csrf令牌的所有值。
  • 在请求标头中CSRF Coo​​kie值= XPp5hAhylAkt27U4SzGPNU7w8SFBJ3RP enter image description here
  • 在表单数据中csrf values = UT24544MghHLZi0IrGHQlCcpk1v0SbCy enter image description here

  • 我已经在中间件类中使用了django.middleware.csrf.CsrfViewMiddleware'我清除了浏览器缓存和cookie。甚至重新启动了系统。

我在不同的网站上使用了完全相同的代码。

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

更新1:如果我在设置中设置debug = False,它可以正常工作。但是我不能保持代码生效。

更新2 :经过进一步调查后,我发现某些浏览器cookie csrftoken的值未被设置为正确的值,而该值正在响应头中传递。如果我从浏览器中删除cookie并将其从控制台设置为正确值,则发布请求可以正常工作。

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

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

1 个答案:

答案 0 :(得分:8)

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

您为favicon定义的网址似乎无效,显然,默认视图会处理不存在的网址。这会设置不同的CSRF cookie,但浏览器中显示的页面仍然在表单中包含初始CSRF令牌。

请求加载页面: enter image description here

请求加载favicon: enter image description here

您可以通过确保favicon存在来修复此特定错误。

请注意,如果您链​​接的任何资源(例如图片)不存在,则此错误会返回,因为您的应用会呈现主页而不是返回404错误。