更改 Django 的 cookie 域设置将如何导致零星的 CSRF 失败?
How would changing Django's cookie domain settings cause sporadic CSRF failures?
在我的 Django 项目中,直到最近我还没有设置 SESSION_COOKIE_DOMAIN
和 CSRF_COOKIE_DOMAIN
。最近我将它们更改为 .mydomain.com
,从那时起,我一直看到某些用户在 AJAX 请求时出现零星的 CSRF 失败。失败表现为 403,日志中出现 CSRF token missing or incorrect.
。
要求用户清除 cookie 似乎可以解决问题,但我想知道设置更改是如何导致此问题的,以及为什么它似乎只发生在某些用户身上而不是其他用户身上。
想知道是否有办法在不要求我的用户清除 cookie 的情况下解决这些问题。
带有新 SESSION_COOKIE_DOMAIN
的 cookie 作为新 cookie 发送,不会替换旧 cookie。所以浏览器会发送 both 到你的服务器。 AFAICT,它以任意顺序发送它们。
这意味着您设置 .mydomain.com
的 cookie,但 接收 您刚刚设置的 cookie .mydomain.com
,或者 whatever.mydomain.com
的陈旧 cookie 最初是隐式设置的(因为 django 只会选择一个,很可能是它看到的最后一个)。你得到哪一个取决于浏览器,可能取决于客户端计算机如何存储它们的一些细节,甚至可能取决于 django 如何读取 headers。这就是失败不一致的原因:它随机地对某些客户端有效而对其他客户端失败。
编辑: 如果您知道原始 cookie 的属性,您可以从服务器中删除陈旧的 cookie。可能最好的方法是设置一个自定义 Set-Cookie
header,其中设置了域和其他属性,以及过去的到期日期。你可以这样做,例如来自 403 页面处理程序。
(参见 https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie and Correct way to delete cookies server-side )
在我的 Django 项目中,直到最近我还没有设置 SESSION_COOKIE_DOMAIN
和 CSRF_COOKIE_DOMAIN
。最近我将它们更改为 .mydomain.com
,从那时起,我一直看到某些用户在 AJAX 请求时出现零星的 CSRF 失败。失败表现为 403,日志中出现 CSRF token missing or incorrect.
。
要求用户清除 cookie 似乎可以解决问题,但我想知道设置更改是如何导致此问题的,以及为什么它似乎只发生在某些用户身上而不是其他用户身上。
想知道是否有办法在不要求我的用户清除 cookie 的情况下解决这些问题。
带有新 SESSION_COOKIE_DOMAIN
的 cookie 作为新 cookie 发送,不会替换旧 cookie。所以浏览器会发送 both 到你的服务器。 AFAICT,它以任意顺序发送它们。
这意味着您设置 .mydomain.com
的 cookie,但 接收 您刚刚设置的 cookie .mydomain.com
,或者 whatever.mydomain.com
的陈旧 cookie 最初是隐式设置的(因为 django 只会选择一个,很可能是它看到的最后一个)。你得到哪一个取决于浏览器,可能取决于客户端计算机如何存储它们的一些细节,甚至可能取决于 django 如何读取 headers。这就是失败不一致的原因:它随机地对某些客户端有效而对其他客户端失败。
编辑: 如果您知道原始 cookie 的属性,您可以从服务器中删除陈旧的 cookie。可能最好的方法是设置一个自定义 Set-Cookie
header,其中设置了域和其他属性,以及过去的到期日期。你可以这样做,例如来自 403 页面处理程序。
(参见 https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie and Correct way to delete cookies server-side )