在同源策略下,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会轻易允许这样做时?
答案 0 :(得分:2)
这些限制并不是为了防止您使用任何类型的服务而实施的,这些限制是为了防止您不知道的恶意代码在您的行为上执行。
所以,如果你想要,你可以获得数据 - 例如使用服务器端脚本,这没关系。但是,如果您将恶意网页加载到浏览器或受恶意软件感染的网页,则其脚本无法代表您执行操作并向第三方服务发送请求。
可以说有这种跨域访问的合法用例,但是互联网上的安全性是一件大事,并且在开发人员感到满意之前就已经考虑过了。
例如,假设您有一个使用Cookie来存储用户信息的在线银行'打开认证会话。您登录银行并检查您的帐户。您在浏览器中打开此选项卡,然后访问恶意网站。该网站使用简单的GET请求将Ajax发送给银行,要求提供交易清单。您的浏览器将调用GET请求并将会话cookie发送给银行,银行将回复您的帐户的敏感信息。恶意脚本然后将数据上载到其服务器。一旦禁止跨源访问,就不再可能出现这种情况。