为什么浏览器不允许 CORS,而服务器端脚本可以轻松做到这一点


Why does the browser not allow CORS when server side script could easily do this?

在同源策略下,Web 浏览器允许包含在第一个网页中的脚本访问第二个网页中的数据,但前提是两个网页具有相同的来源。

但我没有得到它的本质。如果我无法从浏览器发出跨域请求,我将通过PHP脚本进行请求。它会正常工作。不是吗?

因此,而不是执行以下操作:

var xhr = new XMLHttpRequest();
var url = "https://www.google.com/finance/converter?a="+amount+'&from='+from+'&to='+to;
if(xhr) {
    xhr.open('GET', url, true);
    xhr.onload = function() {
        // Handle
    };
    xhr.send();
}

这将导致:

XMLHttpRequest cannot load https://www.google.com/finance/converter?foo. No
'Access-Control-Allow-Origin' header is present on the requested
resource. Origin abc.com is therefore not allowed access.

可以通过我自己的 php 脚本发送一个 ajax 请求,如下所示:

$.ajax({
    method: "GET",
    url: "./bin/http/CimmClient.php",
    dataType: 'html',
    data:{
        a: amount,
        from: from,
        to: to
    }       
})
.done(function(data, textStatus, jqXHR ){
  // Handle
})

这工作得很好。 PHP只向另一个域发送HTTP请求,然后将响应发送回javascript。

那么,原则上有什么区别呢?为什么浏览器阻止发送跨域HTTP请求,而php/java/其他人很容易允许这样做?

实施这些限制不是为了阻止您使用任何类型的服务,而是为了防止您不知道的恶意代码代表您采取行动。

因此,如果您愿意,您可以获取数据 - 例如使用服务器端脚本,这没关系。但是,如果您将恶意网页加载到浏览器或被恶意软件感染的网页,则其脚本无法代表您操作并向第三方服务发送请求。

可以说,这种跨源访问有合法的用例,但互联网上的安全性是一件大事,在开发人员的舒适之前就考虑了它。

例如,假设您有一个使用 Cookie 存储用户打开的经过身份验证的会话的信息的网上银行。您登录银行并检查您的帐户。您在浏览器中打开此选项卡,然后访问恶意网站。该网站将Ajax发送到银行,要求使用简单的GET请求提供交易列表。您的浏览器将调用GET请求并向银行发送会话cookie,银行将回复有关您帐户的敏感信息。然后,恶意脚本将数据上传到其服务器。一旦禁止跨源访问,这种情况就不再可能。

相关文章: