为什么需要 Access-Control-Allow-Origin 标头?

信息安全 http csrf 同源策略 科尔斯
2021-08-18 12:06:48

我了解header的目的Access-Control-Allow-Credentials,但看不到Access-Control-Allow-Originheader 解决了什么问题。

更准确地说,很容易看出,如果默认情况下允许使用凭据的跨域 AJAX 请求,或者如果某些服务器在每个请求上都吐出Access-Control-Allow-Credentials标头,那么 CSRF 攻击将成为可能,否则无法执行。这种情况下的攻击方法很简单:

  1. 将毫无戒心的用户引诱到我的恶意页面。
  2. 我的恶意页面上的 JavaScript 向目标站点的某些页面发送 AJAX 请求(带有cookie)。
  3. 我的恶意页面上的 JavaScript 解析对 AJAX 请求的响应,并从中提取 CSRF 令牌。
  4. 我的恶意页面上的 JavaScript 使用任何方式 - AJAX 或用于 CSRF 请求的传统容器,如表单 POST - 使用用户的 cookie 和他们被盗的 CSRF 令牌的组合来执行操作。

但是,我看不到的是不允许没有标头的未经认证的跨域 AJAX 请求的目的是什么Access-Control-Allow-Origin假设我要创建一个浏览器,它的行为就好像它收到的每个 HTTP 响应都包含

Access-Control-Allow-Origin: *

Access-Control-Allow-Credentials但在使用跨域 AJAX 请求发送 cookie 之前仍需要适当的标头。

由于 CSRF 令牌必须绑定到单个用户(即单个会话 cookie),因此对未经认证的 AJAX 请求的响应不会暴露任何 CSRF 令牌。那么,上述假设的浏览器会将其用户暴露于何种攻击方法(如果有的话)?

2个回答

如果我理解正确,您是说如果不涉及 cookie,为什么浏览器会阻止访问可以通过 Internet 自由获取的资源?考虑一下这种情况:

www.evil.com - 包含试图利用 CSRF 漏洞的恶意脚本代码。

www.privatesite.com - 这是您的外部站点,但您没有使用凭据将其锁定,而是将其设置为无 cookie 并且只允许从您的家庭路由器的静态 IP 访问。

mynas (192.168.1.1)- 这是您的家庭服务器,只能在您的家庭 wifi 网络上访问。由于您是唯一允许连接到家庭 wifi 网络的服务器,因此该服务器不受凭据保护,并允许匿名、无 cookie 访问。

两者www.privatesite.commynas在隐藏的表单字段中生成令牌以防止 CSRF - 但由于您禁用了身份验证,这些令牌不会与任何用户会话绑定。

现在如果你不小心访问www.evil.com了这个域,可能会请求www.privatesite.com/turn_off_ip_lockdown传递跨域请求获得的令牌,甚至mynas/format_drive使用相同的方法。

我不太可能知道,但我想该标准被编写得尽可能健壮,删除它没有意义,Access-Control-Allow-Origin因为它确实在这样的场景中增加了好处。

CORS 政策最初困扰我的是它们不分青红皂白的应用,无论资源/类型如何,我觉得这种情绪与你的问题产生了很好的共鸣。W3 规范实际上建议

可公开访问且没有访问控制检查的资源始终可以安全地返回值为“*”的 Access-Control-Allow-Origin 标头

因此,虽然@SilverlightFox 的答案中的场景是可能的,但恕我直言,在编写规范时不太可能考虑。相反,在这种情况下,W3 似乎是由“所有未明确允许的内容都应受到限制”的心态驱动的,当没有设置正确的标头或个别浏览器缺乏支持时,这种心态会适得其反:

  • 使用第三方 RESTful API 的富客户端应用程序,其中身份验证(如果有)随每个请求一起发送,因此没有“会话”可以劫持(这对您来说是无状态的!)。尽管如此,.json 响应仍受 CORS 约束,因此现在您必须说服第三方实施jsonp或合适的Access-Control-Allow-Origin标头,或者放弃并设置通往其端点的隧道(猜猜我将使用哪个)。

  • Webfonts受 CORS 约束,尽管 afaik 只有 Firefox 实现了这个草案规范。这意味着,如果您将 CDN 用于字体(或所有静态内容的子域),最好*启用它!

  • 对于不回复标头但回显请求标头值的 CDN 的奖励herp derp点:如果它被缓存在带有 的代理上,则来自其他域的用户将无法在没有缓存破坏的情况下访问它(这是种CDN 性能优势方面的挫折)。*Origin...-Allow-Origin: domainA

  • 还有一些边缘场景,例如将外部图像/视频与canvas.

访问合适资源时的这些不便*可以简单地认为是可以接受的,因为在最重要的情况下,至少默认情况下 CORS 正在发挥作用