我们可以设置并允许
的跨源资源共享所有域,特定域和不允许任何域
但我想知道特定域的 CORS 是否有意义。
如果黑客知道服务器允许的域名。 (例如www.facebook.com
)
黑客可以伪造请求中的原始标题 www.facebook.com
因此,从安全的角度来看。我认为只有允许所有域和不允许任何域才有意义。因为很容易伪造请求者的 origin
我是对的吗?
答案 0 :(得分:2)
浏览器是强制执行CORS限制的地方。浏览器知道脚本运行的真实来源。这就是它们的工作方式。如果他们不这样做,那么网络上就没有安全保障。
因此,浏览器会针对他们所知道的正在制作XHR或fetch()
请求的JavaScript代码的真正来源进行CORS检查,而不是Origin
标头的值。
浏览器是设置 Origin
请求标头的内容,并通过网络发送。浏览器根据他们所知道的真实来源设置Origin
值,而不是为了他们自己的使用 - 因为他们已经知道原点是什么,并且该值是他们在内部使用的值。
因此,即使您设法更改浏览器通过网络发送的Origin
标头,这对浏览器无关紧要 - 它将忽略该值并继续检查真实来源。
更多详情
就CORS而言,服务器只是向任何请求它们的客户端发送带有Access-Control-Allow-Origin
标头和其他CORS标头的文档。
考虑您是否使用curl
或其他东西从服务器请求文档:服务器不检查Origin
标头,如果请求来源与请求来源不匹配则拒绝发送文档Access-Control-Allow-Origin
标题。无论如何,服务器都会发送响应。
就客户而言,curl
和非浏览器工具没有开头的概念,因此通常不会发送任何Origin
标头。你可以让curl
发送一个你想要的任何值 - 但它没有意义,因为服务器不关心它的价值。
curl
等,不检查服务器发送的Access-Control-Allow-Origin
响应头的值,如果请求的Origin
标头没有,则拒绝获取文档匹配服务器响应中的Access-Control-Allow-Origin
标头。他们只是得到了文件。
但浏览器不同。浏览器引擎实际上是唯一具有开头概念的客户端,并且知道运行Web应用程序的JavaScript的实际来源。
与curl
等不同,如果请求XHR或fetch()
的来自服务器Access-Control-Allow-Origin
标题中不允许的来源,浏览器不会让您的脚本获取文档
同样,浏览器通过已经知道原点是什么来确定原点的方式,而不是基于任何Origin
请求标头的值可能最终会被发送到请求。