CORS(Access-Control-Allow-Origin 标头)如何提高安全性?

Posted

技术标签:

【中文标题】CORS(Access-Control-Allow-Origin 标头)如何提高安全性?【英文标题】:How does CORS (Access-Control-Allow-Origin header) increase security? 【发布时间】:2016-08-10 20:57:11 【问题描述】:

我现在正在做一些工作,我不得不说,这对我来说毫无意义!基本上,我有一些为网站提供 css、图像等的 CDN 服务器。无论出于何种原因,为了让我的浏览器停止使用 CORS 错误阻止这些资源,我必须让该服务器(CDN)添加 Access-Control-Allow-Origin 标头。但据我所知,这绝对不会增加安全性。我请求引用这些跨域资源的页面不应该告诉浏览器从其他域获取内容是安全的吗?如果那是一个恶意域,它不只是将 Access-Control-Allow-Origin 设置为 * 以便网站加载他们的恶意响应(您不必回答,因为他们显然会回答)?

那么有人可以解释一下这种机制/功能如何提供安全性吗?据我所知,实施者搞砸了,它实际上什么也没做。标头应该来自引用/请求跨域资源的页面,而不是来自被请求的域。

要清楚;如果我在域 A 请求一个页面,则响应包含来自域 B 的 Access-Control-Allow-Origin 标头白名单资源(Access-Control-Allow-Origin:.B.com)是有意义的,但是,域 B 通过提供标头来有效地将自己列入白名单是毫无意义的; Access-Control-Allow-Origin: 这是当前的实现方式。谁能澄清这个功能的好处是什么?

【问题讨论】:

What are the security benefits of CORS preflight requests?的可能重复 【参考方案1】:

如果我在站点 A 上托管了一个受保护的资源,而且还控制站点 B、C 和 D,我可能希望在我的所有站点上使用该资源,但仍阻止其他任何人在他们的站点上使用该资源。因此,我指示我的站点 A 发送 Access-Control-Allow-Origin: B, C, D 及其所有回复。由网络浏览器本身来尊重这一点,而不是对底层 javascript 或任何发起请求的响应(如果它不是来自允许的来源)提供响应。将调用错误处理程序。所以它真的不是为了你的安全,而是为了服务器的荣誉系统(所有主要浏览器都这样做)访问控制方法。

【讨论】:

哦,所以想法是限制资源的使用?不是为了保护请求这些资源的东西? 是的,它是跨域资源共享 (CORS) 的一部分,完全按照您所说的进行。限制/管理您的资源的使用。 CORS 是在某些情况下放宽同源策略的标准化方法,它确实通过在不符合 CORS 的情况下防止潜在的恶意跨域请求来保护最终用户。 一旦我开始从“我不希望随机的人使用我在域 B 的资源”的角度来看待它,尽管我仍然认为它毫无用处。这与互联网的运作方式并不完全一致。如果我想在域 B 中窃取您的资源,那么我只需在浏览器中输入 url 并复制/粘贴/保存它们并将它们放在我自己的服务器上……试图阻止某人做某事毫无意义系统天生就允许你做! 确实还是可以很开放的。值得注意的是,使用 CORS 的服务器可以请求凭据,但前提是这样做!【参考方案2】:

Access-Control-Allow-Origin 主要是关于保护数据不从一台服务器(我们称之为 privateHomeServer.com)泄漏到另一台服务器(我们称之为 evil.com)通过毫无戒心的用户的网络浏览器。

考虑这种情况:

当您不小心偶然发现 evil.com 时,您正在家庭网络上浏览网页。此网页包含恶意 javascript,它会尝试在本地家庭网络上查找 Web 服务器,然后将其内容发送回 evil.com。它通过尝试在所有本地 IP 地址(例如 192.168.1.1、192.168.1.2、.. 192.168.1.255)上打开 XMLHttpRequests 直到找到 Web 服务器来实现此目的。

如果您使用的是不支持Access-Control-Allow-Origin 的旧网络浏览器,或者您在您的 privateHomeServer 上设置了Access-Control-Allow-Origin *,那么您的浏览器会很乐意从您的 privateHomeServer 检索数据(大概您没有打扰密码作为它安全地位于您的家庭防火墙后面),然后将该数据交给恶意 javascript,后者可以将信息发送到 evil.com 服务器。

另一方面,使用支持Access-Control-Allow-Origin 的浏览器和privateHomeServer 上的默认Web 配置(即 发送Access-Control-Allow-Origin *),您的Web 浏览器将阻止恶意javascript 查看从中检索到的任何数据私人家庭服务器。因此,除非您不遗余力地更改服务器上的默认配置,否则您可以免受此类攻击。

关于问题:

我请求的页面不应该引用那些跨域 资源告诉浏览器从另一个获取东西是安全的 域?

您的页面包含试图从特定服务器获取资源的代码这一事实隐含地告诉网络浏览器您认为可以安全地获取资源。需要在其他地方再次重复这一点是没有意义的。

【讨论】:

感谢您的回答,这是我正在寻找的实际示例。【参考方案3】:

CORS 仅对 Mashup 内容提供商有意义,仅此而已。

示例:您是需要注册的嵌入式地图混搭服务的提供商。现在您要确保您的 ajax mashup 映射仅适用于您在其域上的注册用户。应排除其他域。仅出于这个原因,CORS 才有意义。

另一个例子:有人滥用 CORS 作为 REST 服务。聪明的开发者设置了一个 ajax 代理,然后你可以从该服务上的每个域访问。

这样的 ajax 代理对 mashup 没有意义,另一方面 CORS 对 REST-Services 没有意义,因为您可以使用简单的 http-client 绕过限制。

【讨论】:

以上是关于CORS(Access-Control-Allow-Origin 标头)如何提高安全性?的主要内容,如果未能解决你的问题,请参考以下文章

cors技术

ExpressJS 不同的域名 - CORS

在哪里启用cors?

在 Golang 中启用 CORS

Express 中间件未设置 CORS 标头

使用 CORS 的 Javascript 和 angularjs