在安全方面,允许特定域的 CORS 是不是有意义?

Posted

技术标签:

【中文标题】在安全方面,允许特定域的 CORS 是不是有意义?【英文标题】:In the respective of security, is it meaningful to allow CORS for specific domains?在安全方面,允许特定域的 CORS 是否有意义? 【发布时间】:2017-04-11 16:15:09 【问题描述】:

我们可以设置和允许跨域资源共享

所有域特定域不允许任何域

但我想知道允许 CORS特定域 有意义。

如果黑客知道服务器允许的域。 (例如www.facebook.com

黑客可以将请求中的origin header伪装成www.facebook.com

因此,从安全的角度来看。我认为只有允许所有域不允许任何域有意义。因为很容易伪造请求者的origin

我说的对吗?

【问题讨论】:

见***.com/questions/21058183/… CORS 的安全视角不是服务器而是用户代理,这有助于我正确地记住这个概念。没有任何选项可以帮助您保护服务器。 【参考方案1】:

浏览器是执行 CORS 限制的地方。浏览器知道脚本运行的真正来源。这就是它们的工作方式。如果他们不这样做,那么 Web 上的安全性将为零。

因此,浏览器会根据他们知道的发出 XHR 或 fetch() 请求的 javascript 代码的真正来源进行 CORS 检查,而不是根据 Origin 标头的值。

浏览器是设置 Origin 请求标头并首先通过网络发送的。浏览器设置Origin 值是基于它们知道的真实来源,而不是供自己使用——因为它们已经知道来源是什么,并且该值是它们内部使用的值。

因此,即使您设法更改了浏览器通过网络发送的 Origin 标头,这对浏览器来说也无关紧要——它会忽略该值并继续检查真实来源。


更多详情

就 CORS 而言,服务器只需将带有 Access-Control-Allow-Origin 标头和其他 CORS 标头的文档发送回任何请求它们的客户端。

考虑是否使用curl 或其他方式从服务器请求文档:如果请求源与Access-Control-Allow-Origin 标头不匹配,服务器不会检查Origin 标头并拒绝发送文档.无论如何,服务器都会发送响应。

就客户端而言,curl 和非浏览器工具一开始就没有来源的概念,因此通常不发送任何 Origin 标头开始。你可以让curl 发送一个——任何你想要的值——但这毫无意义,因为服务器不关心值是什么。

还有curl等,不要检查服务器发送的Access-Control-Allow-Origin响应头的值,如果请求的Origin头与Access-Control-Allow-Origin头不匹配则拒绝获取文档在服务器响应中。他们只是拿到文件。

但是浏览器不同。浏览器引擎实际上是唯一一开始就有源概念的客户端,并且知道 Web 应用程序的 JavaScript 运行的实际源。

curl 等不同,如果请求它的 XHR 或 fetch() 调用来自服务器的 Access-Control-Allow-Origin 标头中不允许的来源,浏览器将不会让您的脚本获取文档。

同样,浏览器通过已经知道来源是什么来确定来源的方式,而不是基于可能最终在请求中发送的任何Origin 请求标头的值。

【讨论】:

以上是关于在安全方面,允许特定域的 CORS 是不是有意义?的主要内容,如果未能解决你的问题,请参考以下文章

出于安全原因,对未登录用户使用 wordpress nonces 是不是有意义?

如何使用通配符来允许特定域 CORS?

CORS跨域的限制与解决

索引日期类型的核心数据属性是不是有意义?

在 ios6 上运行单元测试是不是有意义

如何用CORS来解决JS中跨域的问题