Set-Cookie从服务器到不同域中的XHR客户端,将域设置为客户端域,是否有效?

问题描述 投票:1回答:1

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

沟通流程1(基线):

  1. 客户端向服务器发出一个简单的GET请求
  2. 服务器使用cookie进行响应,并将Domain属性设置为服务器(Domain = B)
  3. 客户端正在发送另一个HXR请求并且有withCredentials=true
  4. 将cookie发送回服务器而不会出现任何问题

注意:步骤#1中发送的cookie未显示在document.cookies中,即使它未设置为httpOnly(因为它不属于客户端的域)。也试图通过查看“Set-Cookie”标题从xhr获取它,你将被设计阻止:https://fetch.spec.whatwg.org/#forbidden-response-header-name它甚至不会在网络选项卡下的Chrome开发工具中显示!但它仍将被发送)

沟通流程2(我的问题):

  1. 客户端向服务器发出一个简单的GET请求
  2. 服务器使用cookie响应,但将Domain属性设置为客户端(Domain = A)
  3. 客户端正在发送XHR请求并拥有qazxsw poi
  4. cookie不会被发回,似乎不会存储在任何地方

为什么我有点惊讶?由于XHR原点是A并且它请求将cookie设置为域A的东西(如果我查看Postman我清楚地看到withCredentials=true头与Set-Cookie一起发送与请求的Domain相同),并且我拥有最宽松的CORS设置为此,不让我这样做的原因是什么? (我原以为它会失败,但仍让我惊讶)


问题

  1. spec / RFC中最好的地方在哪里澄清这对于XHR也不起作用,其中cookie Origin等于Domain
  2. 如果理论上浏览器确实允许服务器存储cookie,当且仅当Origin与cookie Origin相同且CORS origin允许Origin时,攻击向量是多少。
  3. 有没有其他方法可以使它工作?也许它有效,但我的POC设置不正确?

附录:推理

我正在寻找一种方法来使用类似Domain的交叉源CSRF,但由于交叉原点问题,似乎这是不可能的。我想到的唯一解决方法是从服务器发送CSRF令牌作为标头,然后客户端可以将其保存为稍后可以访问的cookie,还有其他方法吗?这被认为是安全的吗?

cookies cors xmlhttprequest cross-domain csrf
1个回答
2
投票

资源只能为其主机的可注册域设置cookie。如果Facebook使用谷歌字体,谷歌可以用它来覆盖Facebook的cookie,那将是非常灾难性的。

至于定义的地方,Cookie to header token method的第5步和第6步处理这个问题。 (在解释响应中的https://tools.ietf.org/html/rfc6265#section-5.3头时,Fetch在很大程度上遵循这个RFC。)

© www.soinside.com 2019 - 2024. All rights reserved.