更改Django的cookie域设置将如何导致偶发的CSRF故障?

时间:2018-08-15 22:54:31

标签: python django cookies csrf

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

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

想知道是否有一种方法可以解决这些问题而不要求我的用户清除cookie。

1 个答案:

答案 0 :(得分:1)

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

这意味着您正在设置 .mydomain.com的cookie,但是接收您刚刚为.mydomain.com设置的cookie或whatever.mydomain.com的陈旧cookie最初是隐式设置的(因为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