跨域AJAX请求未被阻止:这是一个安全漏洞吗?

时间:2013-10-30 17:41:19

标签: javascript ajax http cross-domain

我花了最后3天研究如何使用XMLHttpRequest发出跨域请求。最好的替代方案确实是我已经使用的JSONP。

但我还有一个问题,我无法找到答案。我阅读了数百个帖子(包括SO),没有人有一个很好的可靠回答(很好的参考)。希望有人可以提供帮助。

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

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这样大的响应,我的firebug告诉我浏览器确实从网络服务器下载了所有1MB,最后它显示了一条消息“Access否认“如预期的那样。因此,如果相同的原始策略禁止读取该数据,为什么要下载所有文件。

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

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

我在IE 7,8和9以及Chrome最新和Firefox最新版本中测试了此脚本,行为是相同的:请求已完成,浏览器会下载所有响应,而不会使其无法执行SOP。

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

2 个答案:

答案 0 :(得分:5)

可以进行,并且无论CORS如何,服务器都可以生成响应。但是,响应可能会被隐藏。最近balpha wrote about this in his blog

  

请注意,相同的原始政策并不一定会阻止请求本身 - 它只会阻止响应被访问。恶意网站可以例如只需重定向您的浏览器,或提交表单,或包含图片或iframe - 在所有这些情况下都会向您的网站发出请求;邪恶的网站没有看到回应。

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

答案 1 :(得分:0)

您可以使用简单的图像文件实现相同的效果(如您所说的dos攻击),它不一定需要是XHR。链接来自不同网站的图像文件,将数百万个图像文件放入您的页面,将其显示给您的用户并进行繁荣。