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



我的应用程序中有多个子域。有一个用于用户登录/会话的父域 cookie,以及一个用于跨站点请求伪造保护 (CSRF( 的子域 Cookie。请求使用跨源资源共享 (CORS( 在子域之间传输,使用所有子域的登录/会话 cookie。

  • main.foo.com 是用户登录的位置。登录/会话 Cookie 使用域foo.com
  • app.foo.com 是应用程序的大部分驻留位置。这是我发生错误时的活动页面。
  • message.foo.com 用于在用户之间发送消息。它是它自己的django应用程序,带有一个csrf cookie,使用域message.foo.com用于其表单。它还使用来自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 Cookie。

据我所知,cookie之间的区别在于它们的域。登录/会话 cookie 设置为 foo.com ,因此所有子域都使用它。CSRF cookie 由 message.foo.com 设置,因此只能将其发送回该域。但即使请求要message.foo.com,Chrome 隐身也不会发送 cookie。它甚至可能不接受饼干。(很难判断它是否不接受cookie,或者它只是没有将其发回。

这种 cookie 场景似乎是合法的。Cookie 被发送回设置它的子域。没有其他子域尝试读取或修改 Cookie。发送请求的源已使用 CORS 标头进行授权。

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

抱歉,堆栈溢出。这个问题实际上不是关于我认为的。

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

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

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

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