我想了解CORS。根据我的理解,它使您能够限制哪些域可以访问服务器上的资源。然而,这似乎并不完整。例如,我有一个没有启用CORS的Web服务。我无法通过jQuery从我的Web应用程序中访问此Web服务(该应用程序在localhost上运行)。但是,我可以从Postman获得Web服务。所以,我有点困惑。是否有一些涉及CORS的额外客户端工作?
答案 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-Origin
和Access-Control-Allow-Methods
,这些标头可以限制允许的请求类型。当浏览器被告知允许哪些来源时,它将阻止来自不允许来源的未来请求。
答案 1 :(得分:8)
实际上这两者都有。您的浏览器将阻止CORS请求,除非请求的来源(即引荐来源URL域)位于目标上的白名单中,或者目标批准所有请求而不管来源。
在这两种情况下,都会添加所需的标题(Access-Control-Allow-Origin),告诉浏览器可以将请求发送到目的地。
这可确保恶意用户无法在用户不知情的情况下向其他域发送请求。