当服务器端脚本可以轻松做到这一点时,为啥浏览器不允许 CORS? [复制]
Posted
技术标签:
【中文标题】当服务器端脚本可以轻松做到这一点时,为啥浏览器不允许 CORS? [复制]【英文标题】:Why does the browser not allow CORS when server side script could easily do this? [duplicate]当服务器端脚本可以轻松做到这一点时,为什么浏览器不允许 CORS? [复制] 【发布时间】:2016-05-20 11:52:48 【问题描述】:在同源策略下,网络浏览器允许包含在第一个网页中的脚本访问第二个网页中的数据,但前提是两个网页具有相同的来源。
但我没有得到它的精髓。如果我无法从我的浏览器发出跨域请求,我将通过我的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 很容易允许这样做?
【问题讨论】:
它被称为“安全”和“知识产权”——如果远程站点允许您从浏览器访问他们的资源,他们将在适当的响应中发出 CORS 标头......或者如果他们'回到过去,他们可能将 JSONP 作为一种使用资源的方式 您需要在服务器中添加一个标头以允许这样做。检查这个答案,它解释了这个:***.com/a/10636765/5906538希望这对你有帮助:) 如果你想要专门的货币转换,有API可供你使用,你只需要做一些研究 @JaromandaX 为什么同样的理论在通过php
发送请求时不适用?
好问题。 CORS 是一个复杂的主题。浏览器过去对跨源请求没有任何限制......这使得各种讨厌的页面可能会窃取您的银行密码等......浏览器中的跨源限制使得这种情况不太可能,但这意味着真正的远程访问更难/不可能. CORS 只是允许源服务器控制访问。使用 PHP 等访问与浏览器访问网站的方式不同,如果有人试图使用 PHP 中间人获得非法访问,正确编写的网站不会遇到安全问题
【参考方案1】:
实施这些限制并不是为了阻止您使用任何类型的服务,而是为了防止您不知道的恶意代码代表您采取行动。
因此,如果您愿意,您可以获取数据 - 例如使用服务器端脚本,没关系。但是,如果您将恶意网页加载到浏览器或被恶意软件感染的网页,其脚本将无法代表您执行操作并向第三方服务发送请求。
可以说,这种跨源访问存在合法的用例,但互联网上的安全性是一件大事,它在开发人员的舒适度之前被考虑。
例如,假设您有一家在线银行,它使用 cookie 来存储有关用户打开的已验证会话的信息。您登录银行并检查您的帐户。您在浏览器中打开此选项卡并访问恶意网站。该网站使用简单的 GET 请求将 Ajax 发送到银行,要求提供交易列表。您的浏览器将调用 GET 请求并向银行发送会话 cookie,银行将回复有关您帐户的敏感信息。然后恶意脚本将数据上传到其服务器。一旦禁止跨域访问,这种情况就不可能了。
【讨论】:
以上是关于当服务器端脚本可以轻松做到这一点时,为啥浏览器不允许 CORS? [复制]的主要内容,如果未能解决你的问题,请参考以下文章