在安全方面,允许特定域的 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 是不是有意义?的主要内容,如果未能解决你的问题,请参考以下文章