CORS 如何防止 XSS?
TL;DR:CORS 如何防止 XSS?它不是。它并不意味着这样做。
CORS 旨在允许资源主机(通过 HTTP 提供其数据的任何服务)限制哪些网站可以访问该数据。
示例:您正在托管一个显示流量数据的网站,并且您正在网站上使用 AJAX 请求。如果没有 SOP 和 CORS,任何其他网站都可以通过简单的 AJAXing 到您的端点来显示您的流量数据;任何人都可以轻松“窃取”您的数据,进而窃取您的用户和您的资金。
在某些情况下,共享数据(Cross O rigin Resource Sharing)是有目的的,例如在您的网页上显示来自 Facebook API 的点赞和内容时。由于上一段中解释的原因,简单地删除 SOP 来实现这一点是一个坏主意。因此引入了 CORS。
CORS 与 XSS 无关,因为任何可以将恶意 JavaScript 片段放入网站的攻击者也可以设置发送正确 CORS 标头的服务器。CORS 无法阻止恶意 JavaScript 将会话 ID 和永久登录 cookie 发送回攻击者。
跨站点脚本 (XSS) 是在另一个站点的上下文中执行攻击者定义的脚本代码。CORS 并不能阻止 XSS,实际上它与 XSS 无关。
相反,CORS 提供了一种方法来削弱对 Ajax 请求(即 XMLHTTPRequest)的现有限制,希望不会引入更多的安全问题。传统上,XMLHTTPRequest 被限制在同一来源内进行通信,即不可能向某个外部站点发送请求。这样做是为了使攻击者无法执行跨站点请求并获取请求的结果,因为这将允许攻击者从用户登录的站点读取数据(因为会话和其他 cookie 随每个请求网站)。
使用 CORS 可以部分消除此限制。现在可以将 XMLHTTPRequest 发送到另一个站点,但是如果远程站点显式添加了一些允许访问的 CORS 标头,则结果只能在应用程序内部读取。但同样,这不是在远程站点上执行脚本,因此这与 XSS 无关。
CORS 和 XSS 是相关的,但不是直接相关的。最好的解释方式是举例:我们将考虑 3 个服务器(your_bank.com、api.your_bank.com、badguy.com*)和 1 个客户端(您的浏览器)。
- 您已登录 your_bank.com(您的浏览器包含身份验证 cookie)。
- Your_bank.com 通过使用更多 cookie(保存在浏览器中)向 api.your_bank.com 发送 AJAX 请求来进行交易。通常您的浏览器的 SOP 会阻止此请求,但 CORS(由 api.your_bank.com 授予)允许它。
- 您在 badguy.com 上看到了一些闪亮的东西,然后访问该页面。
- Badguy.com 通过使用浏览器中保存的该域的 cookie 向 api.your_bank.com 发送 AJAX 请求来尝试交易。
在第 4 步,您的浏览器(未受到威胁)拥有发送到 api.your_bank.com 的“Origin”标头。如果 CORS 配置正确,此步骤将被阻止。作为 cookie 和请求标头的所有者,您的浏览器是对其他网站的访问权限。
* badguy.com 网站可能是合法的,但存在 XSS 问题。
CORS 不保护任何东西,而是 SOP(同源策略)保护一些东西。SOP 保护目标域和浏览器用户。
事实上,CORS 削弱了 SOP 的现有限制,以帮助网站开发人员使用来自其他来源的共享数据。