【问题标题】:How would changing Django's cookie domain settings cause sporadic CSRF failures?更改 Django 的 cookie 域设置会如何导致零星的 CSRF 失败?
【发布时间】:2019-01-22 20:26:30
【问题描述】:

在我的 Django 项目中,直到最近我还没有设置 SESSION_COOKIE_DOMAINCSRF_COOKIE_DOMAIN。最近我将它们更改为.mydomain.com,从那时起,我一直看到某些用户的 AJAX 请求中出现零星的 CSRF 失败。故障表现为 403,日志中出现 CSRF token missing or incorrect.

要求用户清除 cookie 似乎可以解决问题,但我想知道设置更改是如何导致此问题的,以及为什么它似乎只发生在某些用户而不是其他用户。

想知道是否有办法在不要求我的用户清除 cookie 的情况下解决这些问题。

【问题讨论】:

  • 我不知道答案,但文档确实suggest 表明这可能会导致问题:“在生产站点上更新此设置时要小心。如果您更新此设置以启用交叉-以前使用标准域 cookie 的站点上的域 cookie,现有用户 cookie 将被设置为旧域。这可能导致他们无法登录,只要这些 cookie 持续存在。"

标签: python django cookies csrf


【解决方案1】:

带有新SESSION_COOKIE_DOMAIN 的cookie 作为新cookie 发送,不会替换旧cookie。所以浏览器会将 both 发送到您的服务器。 AFAICT,它以任意顺序发送它们。

这意味着您设置.mydomain.com 的cookie,但接收您刚刚为.mydomain.com 设置的cookie,或为@ 设置的旧cookie 987654326@ 最初是隐式设置的(因为 django 只会选择一个,很可能是它看到的最后一个)。你得到哪一个取决于浏览器,可能取决于客户端计算机如何存储它们的一些细节,甚至可能取决于 django 如何读取标头。这就是失败不一致的原因:它随机地对某些客户端起作用,而对另一些客户端则失败。

编辑:如果您知道原始 cookie 的属性,您可以从服务器中删除过时的 cookie。可能最好的方法是设置一个自定义的Set-Cookie 标头,其中设置了域和其他属性,以及过去的到期日期。你可以这样做,例如来自 403 页面处理程序。 (见https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-CookieCorrect way to delete cookies server-side

【讨论】:

  • 这确实是问题所在。我们通过在我们的基本模板中添加一个 JS sn-p 来解决这个问题,该模板使用 Domain= 设置了一个过期的 cookie,并且有效地使旧的无效。
猜你喜欢
  • 2012-08-02
  • 2013-05-12
  • 2013-11-05
  • 2021-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-09
相关资源
最近更新 更多