当服务器端脚本可以轻松地执行此操作时,为什么浏览器不允许CORS?

时间:2016-02-10 08:19:15

标签: javascript php http xmlhttprequest cors

在同源策略下,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 / Others会轻易允许这样做时?

1 个答案:

答案 0 :(得分:2)

这些限制并不是为了防止您使用任何类型的服务而实施的,这些限制是为了防止您不知道的恶意代码在您的行为上执行。

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

可以说有这种跨域访问的合法用例,但是互联网上的安全性是一件大事,并且在开发人员感到满意之前就已经考虑过了。

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