CORS - 它是客户端的东西,服务器端的东西,还是传输级别的东西?

时间:2016-04-30 19:03:46

标签: javascript cors

我想了解CORS。根据我的理解,它使您能够限制哪些域可以访问服务器上的资源。然而,这似乎并不完整。例如,我有一个没有启用CORS的Web服务。我无法通过jQuery从我的Web应用程序中访问此Web服务(该应用程序在localhost上运行)。但是,我可以从Postman获得Web服务。所以,我有点困惑。是否有一些涉及CORS的额外客户端工作?

2 个答案:

答案 0 :(得分:54)

服务器负责报告允许的来源。 Web浏览器负责强制执行仅从允许的域发送请求。

如果未启用CORS,浏览器将依赖same origin policy。浏览器仅允许与源相同的主机发出请求。当没有明确允许来源时,假设相同的原始政策。

浏览器以外的HTTP客户端不会使用相同的源策略或CORS。从这些其他HTTP客户端发出的请求不具有来源。除非Postman桌面应用程序模拟浏览器,否则它将能够向任何URL发出请求。

需要CORS和相同的原始策略,因为浏览器不会隐式信任它访问的网站。他们不保护原始网站,他们保护接收交叉来源请求的网站。

如果没有这些政策,可以通过广告网络或脚本注入分发重复加载网站的简单脚本,然后加载脚本的任何浏览器都会导致网站上的拒绝服务攻击。使用CORS和相同的源策略,浏览器将限制此脚本的影响。

CORS示例:

网络浏览器从 function myFunction() { var text =(document.getElementById("htext").value); var meow = " <p> <,> </p>"; var i; for (i = 0; i < 9000; i++) { text+=text[i] ; } document.getElementById("demo2").innerHTML = text; } </script> <p>Enter your text: <input type="text" id="htext"/> <button onclick="myFunction();">click on me</button> </p> 加载页面。该页面包含一个向www.example.com发出请求的脚本。请求的来源是www.example.org。浏览器首先发出请求或发送www.example.com请求(预检请求)。当OPTIONS处的服务器收到来自www.example.org以外的来源的请求时,它会以响应标头www.example.org进行响应,该响应标头告诉浏览器允许发出请求的来源。它还可以响应其他标头,例如Access-Control-Allow-OriginAccess-Control-Allow-Methods,这些标头可以限制允许的请求类型。当浏览器被告知允许哪些来源时,它将阻止来自不允许来源的未来请求。

答案 1 :(得分:8)

实际上这两者都有。您的浏览器将阻止CORS请求,除非请求的来源(即引荐来源URL域)位于目标上的白名单中,或者目标批准所有请求而不管来源。

在这两种情况下,都会添加所需的标题(Access-Control-Allow-Origin),告诉浏览器可以将请求发送到目的地。

这可确保恶意用户无法在用户不知情的情况下向其他域发送请求。