tl; dr,域A中的XHR客户端正在向域B中的服务器发送请求,服务器使用带有Set-Cookie
(客户端域,XHR的Domain=A
)的Origin
进行响应,所有CORS头设置正确,是否有效?
众所周知,人们无法将cookie设置为另一个域。 (How to set a cookie for another domain
但是考虑到以下情况:
域A中的客户端,基于Web的客户端
域B中的服务器,使用CORS头设置允许A作为原点,包括Access-Control-Allow-Credentials
设置为true
withCredentials=true
注意:步骤#1中发送的cookie未显示在document.cookies中,即使它未设置为httpOnly(因为它不属于客户端的域)。也试图通过查看“Set-Cookie”标题从
xhr
获取它,你将被设计阻止:https://fetch.spec.whatwg.org/#forbidden-response-header-name它甚至不会在网络选项卡下的Chrome开发工具中显示!但它仍将被发送)
为什么我有点惊讶?由于XHR原点是A并且它请求将cookie设置为域A的东西(如果我查看Postman我清楚地看到withCredentials=true
头与Set-Cookie
一起发送与请求的Domain
相同),并且我拥有最宽松的CORS设置为此,不让我这样做的原因是什么? (我原以为它会失败,但仍让我惊讶)
Origin
等于Domain
Origin
与cookie Origin
相同且CORS origin允许Origin时,攻击向量是多少。我正在寻找一种方法来使用类似Domain
的交叉源CSRF,但由于交叉原点问题,似乎这是不可能的。我想到的唯一解决方法是从服务器发送CSRF令牌作为标头,然后客户端可以将其保存为稍后可以访问的cookie,还有其他方法吗?这被认为是安全的吗?
资源只能为其主机的可注册域设置cookie。如果Facebook使用谷歌字体,谷歌可以用它来覆盖Facebook的cookie,那将是非常灾难性的。
至于定义的地方,Cookie to header token method的第5步和第6步处理这个问题。 (在解释响应中的https://tools.ietf.org/html/rfc6265#section-5.3头时,Fetch在很大程度上遵循这个RFC。)