我的应用中有多个子域名。用户登录/会话有父域cookie,跨域请求伪造保护(CSRF)有子域cookie。请求使用跨源资源共享(CORS)在子域之间进行,使用所有子域的登录/会话cookie。
foo.com
。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 Cookie。
据我所知,cookies之间的区别在于他们的域名。登录/会话cookie设置为foo.com
,因此所有子域都使用它。 CSRF cookie由message.foo.com
设置,因此只应将其发送回该域。但即使请求转到message.foo.com
,Chrome Incognito也不会发送Cookie。它甚至可能没有接受cookie。 (很难说它是否不接受cookie或者它是否只是不发送它。)
这种Cookie方案似乎合法。 cookie被发送回设置它的子域。没有其他子域尝试读取或修改cookie。发送请求的源已经过CORS头的授权。
为什么Chrome不发送该Cookie?这种行为是否记录在某处?
答案 0 :(得分:0)
抱歉,Stack Overflow。这个问题实际上并不是我认为的那样。
问题是我在Django代码中做了一些事情,它阻止了CSRF cookie被发送到浏览器。非隐身浏览器仍然保存了Cookie,但隐身的浏览器在关闭时丢弃了Cookie。因此,当我重新打开浏览器时,除了隐身浏览器之外,他们仍然拥有旧的CSRF cookie。
当我重命名CSRF cookie并且所有浏览器都停止工作时,我发现了这一点。我在Firebug和Chrome开发工具中看到了cookie,所以我认为它还没有被发送。
因此,最终结果是cookie的工作符合我的预期。我所有的困惑都是由于缓存的cookie仍然被发送。据我所知,与Incognito的唯一区别在于,当您关闭最后一个Incognito窗口时,它会清除所有Cookie。
希望其他人会被这个问题提醒,缓存可能妨碍你的调试。在这个过程中尽早检查可以为我节省很多时间。