Google Chrome浏览器在隐身模式下的ajax请求中是否有针对跨域Cookie的不同规则?如果是这样,我如何找到这些规则?

时间:2014-08-31 20:40:27

标签: ajax cookies cross-domain cors

我的应用中有多个子域名。用户登录/会话有父域cookie,跨域请求伪造保护(CSRF)有子域cookie。请求使用跨源资源共享(CORS)在子域之间进行,使用所有子域的登录/会话cookie。

  • main.foo.com是用户登录的位置。登录/会话cookie使用域foo.com
  • app.foo.com是应用程序的大部分内容所在。这是我的错误发生时的活动页面。
  • message.foo.com用于在用户之间发送消息。它是自己的django应用程序,使用域message.foo.com的csrf cookie与其表单一起使用。它还使用foo.com中的登录/会话cookie。

因此,用户在app.foo.com/index.php,并且ajax POST需要转到message.foo.com。浏览器向message.foo.com发出了ajax GET请求,这些请求设置了CSRF cookie。 ajax POST与适当的CORS头一起发送。

如果我使用@csrf_exempt装饰器在Django视图中禁用CSRF,则忽略丢失的cookie并正确处理POST。否则,我收到CSRF的403错误。

CSRF cookie以正常模式从Firefox和Chrome发送。当Chrome为隐身版时,不会发送CSRF Coo​​kie。

据我所知,cookies之间的区别在于他们的域名。登录/会话cookie设置为foo.com,因此所有子域都使用它。 CSRF cookie由message.foo.com设置,因此只应将其发送回该域。但即使请求转到message.foo.com,Chrome Incognito也不会发送Cookie。它甚至可能没有接受cookie。 (很难说它是否不接受cookie或者它是否只是不发送它。)

这种Cookie方案似乎合法。 cookie被发送回设置它的子域。没有其他子域尝试读取或修改cookie。发送请求的源已经过CORS头的授权。

为什么Chrome不发送该Cookie?这种行为是否记录在某处?

1 个答案:

答案 0 :(得分:0)

抱歉,Stack Overflow。这个问题实际上并不是我认为的那样。

问题是我在Django代码中做了一些事情,它阻止了CSRF cookie被发送到浏览器。非隐身浏览器仍然保存了Cookie,但隐身的浏览器在关闭时丢弃了Cookie。因此,当我重新打开浏览器时,除了隐身浏览器之外,他们仍然拥有旧的CSRF cookie。

当我重命名CSRF cookie并且所有浏览器都停止工作时,我发现了这一点。我在Firebug和Chrome开发工具中看到了cookie,所以我认为它还没有被发送。

因此,最终结果是cookie的工作符合我的预期。我所有的困惑都是由于缓存的cookie仍然被发送。据我所知,与Incognito的唯一区别在于,当您关闭最后一个Incognito窗口时,它会清除所有Cookie。

希望其他人会被这个问题提醒,缓存可能妨碍你的调试。在这个过程中尽早检查可以为我节省很多时间。