【发布时间】:2014-10-09 05:38:07
【问题描述】:
在我们最近的版本中,我们遇到了 Django 中重复的 CSRF 令牌 cookie 的问题。我们刚刚从 Django 1.4 升级到 1.6,在 1.4 中我们从未遇到任何问题。基本上,对于每个用户来说,一切都很好,但在某些时候,他们最终会拥有多个 CSRF 令牌 cookie,并且浏览器会感到困惑并且不知道该使用哪一个。它通常选择错误并导致 CSRF 失败问题。我们的网站使用多个子域,因此通常有一个 cookie 用于 .site.com、.sub.site.com、site.com 和其他变体。
我们尝试将“CSRF_COOKIE_DOMAIN”设置为 .site.com,这似乎降低了问题的发生频率,但在使用子域并且用户注销并以其他用户身份重新登录时,它仍然偶尔会发生.
我们还发现我们的基本模板中没有定义网站图标快捷方式,导致额外的请求通过中间件,但已修复。然后我们确认只有真正的请求通过中间件,而不是任何静态或媒体文件。
我们仍然无法通过命令重现该问题,而且通常只要发生此问题,清除 cookie 就可以作为临时修复,但它仍然会定期发生。有谁知道为什么会发生这种情况?文档中是否缺少某些内容?
谢谢。
编辑:
我忘记提及的一件事是我们有多个服务器环境(site.com、demo.site.com 和 beta.site.com)。经过一番挖掘,看起来在 beta 测试然后使用生产的用户有跨环境 cookie 冲突。刚才我们尝试将每个环境的 csrf cookie 域设置为“.beta.site.com”和“.demo.site.com”,而不仅仅是“.site.com”,这似乎有帮助,尤其是当您清除您的在每个环境中工作之间的 cookie。不过,.site.com cookie 在 beta 版和演示版的生产冲突中仍有可能发生冲突,但这至少不是问题。
那么我们还有什么可以做的吗?此外,当用户拥有旧的“site.com”cookie 与新指定的“.site.com”cookie 发生冲突时,一旦我们将其推送到生产环境中,我们能做些什么吗?
编辑 2:
我发布了解决方案,但它不会让我接受几天。
【问题讨论】:
-
您的意思是当典型用户注销应用程序并以其他用户身份登录时会出现此问题,您确定在注销时浏览器会话已正确清除吗?
-
是的,会话肯定被正确清除了。我们使用标准的 Django 注销,无论您是否在子域中,在任何给定时间都只有一个会话 cookie。
标签: python django cookies csrf django-1.6