7

我花了最后 3 天的时间研究如何使用 XMLHttpRequest 进行跨域请求。最好的选择确实是我已经在使用的 JSONP。

但是我仍然有一个问题,我无法在任何地方找到答案。我阅读了数百篇帖子(包括 SO),但没有人有一个很好的可靠答案(有很好的参考)。希望这里有人可以提供帮助。

话虽如此,我在许多网站上读到,由于安全原因,我无法从域 example.com 向 yyy.com 发出 Ajax 请求并获取我想要的数据。这很清楚,我对此毫无疑问。但问题是当我在本地主机中运行下面的代码时(所以我的域是“本地主机”,我不应该能够从另一个域请求任何数据)。

xhReq = new XMLHttpRequest();
xhReq.open("GET","http://domain.com.br?parameter",true);
xhReq.send(null);

当我检查 Firebug Net 选项卡时,我意识到请求没有被阻止!这是明确要求的。我简直不敢相信。所以我在 domain.com.br/log.php 中创建了一个文件,我可以在其中记录任何访问我的域的请求。令人惊讶的是,我触发 localhost 的所有请求都在访问我的 domain.com.br。当我尝试获取响应时,由于我的 Chrome 和 FIrebug 浏览器的原始策略相同,我真的无法得到它。但是,尽管我无法操纵响应者,但请求确实到达了网络服务器,这让我感到非常惊讶。

更令人惊讶的是,如果 domain.com.br/log.php 生成了 1MB 的巨大响应,我的萤火虫向我展示了浏览器确实从网络服务器下载了所有 1MB,最后它显示一条消息“访问被拒绝”为预期的。那么,如果同源策略禁止读取该数据,为什么还要下载所有文件。

最后,令我惊讶的是,我阅读的所有网站和规范都非常清楚地表明,当目标域与源域不匹配时,使用 Ajax 阻止了请求。但显然,通过我的实验,请求正在完成,尽管我无法访问响应数据。

让我感到不安的是,它可能会打开一个巨大的安全漏洞,一个每天有数千次浏览的网站可以运行这 3 行代码,并在一个不友好的网站上引发巨大的 Ddos 攻击,只是让用户请求另一个网站的页面间隔很小,因为浏览器不会阻止请求。

我在 IE 7、8 和 9 以及 Chrome 最新版本和 Firefox 最新版本中测试了这个脚本,并且行为是相同的:请求完成,浏览器下载所有响应,但无法执行 SOP。

希望有人可以向我解释为什么规格如此错误或我理解错误!

4

2 回答 2

5

可以发出请求,并且服务器可以生成响应,而不管 CORS。但是,响应可能会被隐藏。balpha最近在他的博客中写道

请注意,同源策略并不一定会阻止请求本身——它只是阻止响应被访问。例如,恶意站点可能只是重定向您的浏览器,或提交表单,或包含图像或 iframe——在所有这些情况下,都会向您的站点发出请求;邪恶的网站只是没有看到响应。

在某种程度上,浏览器必须向服务器发出请求,以查看它是否提供“Access-Control-Allow-Origin”标头。请记住,CORS 完全由浏览器实现。有人可能只是编写一个控制台应用程序来向您的服务器发出请求,因此您不应该依赖 CORS 来确保请求仅来自您自己的站点。

于 2013-10-30T17:47:44.867 回答
0

你可以用一个简单的图像文件来达到同样的效果(就像你说的dos攻击),它不一定需要是XHR。链接来自不同网站的图像文件,将数百万个图像文件放在您的页面中,将其显示给您的用户并蓬勃发展。

于 2013-10-30T17:56:40.807 回答