Python 如何改变Django';s cookie域设置是否会导致偶发的CSRF故障?
在我的Django项目中,直到最近我还没有设置Python 如何改变Django';s cookie域设置是否会导致偶发的CSRF故障?,python,django,cookies,csrf,Python,Django,Cookies,Csrf,在我的Django项目中,直到最近我还没有设置SESSION\u COOKIE\u DOMAIN和CSRF\u COOKIE\u DOMAIN。最近我把它们改成了.mydomain.com,从那以后,我一直看到某些用户在AJAX请求中偶尔出现CSRF故障。故障表现为403,日志中出现CSRF令牌缺失或不正确。 要求用户清除cookies似乎可以解决这个问题,但我想知道设置更改是如何导致这一问题的,以及为什么它似乎只发生在一些用户身上,而不是其他用户身上 想知道是否有办法解决这些问题而不要求我的用
SESSION\u COOKIE\u DOMAIN
和CSRF\u COOKIE\u DOMAIN
。最近我把它们改成了.mydomain.com
,从那以后,我一直看到某些用户在AJAX请求中偶尔出现CSRF故障。故障表现为403,日志中出现CSRF令牌缺失或不正确。
要求用户清除cookies似乎可以解决这个问题,但我想知道设置更改是如何导致这一问题的,以及为什么它似乎只发生在一些用户身上,而不是其他用户身上
想知道是否有办法解决这些问题而不要求我的用户清除cookie。带有新的
会话\u cookie\u域的cookie将作为新cookie发送,而不会替换旧cookie。因此,浏览器会将这两个信息发送到您的服务器。AFAICT,它以任意顺序发送它们
这意味着您正在为.mydomain.com
设置一个cookie,但是接收到您刚刚为.mydomain.com
设置的cookie,或者是为最初隐式设置的任何东西设置的陈旧cookie(因为django只会选择一个,很可能是最后一个看到的)。哪一个取决于浏览器,可能取决于客户端计算机如何存储它们的一些细节,甚至可能取决于django如何读取标题。这就是失败不一致的原因:它对某些客户端随机工作,而对其他客户端则失败
编辑:如果您知道原始cookie的属性,可以从服务器中删除过时的cookie。最好的方法可能是设置一个自定义set Cookie
头,并设置域和其他属性,以及过去的过期日期。您可以这样做,例如从403页处理程序。
(请参阅和)我不知道答案,但文档中指出这可能会导致问题:“在生产站点上更新此设置时要小心。如果更新此设置以在以前使用标准域Cookie的站点上启用跨域Cookie,则现有用户Cookie将设置为旧域。这可能会导致他们无法登录,只要这些cookie持续存在。”这确实是问题所在。我们通过在基本模板中添加一个JS代码片段来解决问题,该代码片段将过期cookie设置为Domain=
,从而有效地使旧cookie无效。