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

Sam*_*mul 7 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);
Run Code Online (Sandbox Code Playgroud)

当我检查Firebug Net选项卡时,我发现请求未被阻止!明确要求.我简直不敢相信.所以我在domain.com.br/log.php中创建了一个文件,在那里我可以记录任何命中我域名的请求.令人惊讶的是,我解雇localhost的所有请求都是我的domain.com.br.当我尝试获取响应时,由于我的Chrome和FIrebug浏览器的原始策略相同,我实在无法得到它.但我真的很惊讶,尽管我无法操纵响应,但请求真的打到了网络服务器.

更令人惊讶的是,如果domain.com.br/log.php生成一个像1MB大的响应,我的firebug告诉我浏览器确实从网络服务器下载了所有1MB,最后它显示一条消息"拒绝访问"预期.因此,如果相同的原始策略禁止读取该数据,为什么要下载所有文件.

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

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

我在IE 7,8和9以及Chrome最新和Firefox最新版本中测试了这个脚本,行为是相同的:请求已完成,浏览器下载了所有响应,但没有让它可以执行SOP.

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

vcs*_*nes 5

可以进行请求,并且服务器可以生成响应,而不管CORS.但是,响应可能是隐藏的.balpha 最近在他的博客中写道:

请注意,相同的源策略不一定会阻止请求本身 - 它只是阻止响应可访问.恶意网站可以重新定位您的浏览器,或提交表单,或包含图片或iframe - 在所有这些情况下,您的网站都会提出请求; 邪恶的网站只是没有看到响应.

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