我花了最近3天学习如何使用XMLHttpRequest进行跨域请求。最好的选择是我已经使用的JSONP。跨域AJAX请求没有被阻止:这是一个安全漏洞吗?
但我仍然有一个问题,我无法找到答案无处。我读了数百篇文章(包括SO),没有人有很好的答案(很好的参考)。希望这里的某个人能够帮忙
说,我在很多网站上读到,由于安全原因,我无法从域example.com向yyy.com发送Ajax请求并获取我想要的数据。这很清楚,我对此毫无疑问。但问题是当我运行下面的代码在我的本地主机(所以我的域名是“localhost”,我不应该能够从另一个域请求任何数据)。
xhReq = new XMLHttpRequest();
xhReq.open("GET","http://domain.com.br?parameter",true);
xhReq.send(null);
当我检查Firebug Net Tab时,我意识到请求没有被阻止!它被明确要求。我无法相信。所以我在domain.com.br/log.php中创建了一个文件,我可以记录任何打到我的域名的请求。令人惊讶的是,我发布localhost的所有请求都击中了我的domain.com.br。当我试图获取响应时,我真的无法得到它,因为我的Chrome和FIrebug浏览器采用了相同的源策略。但我真的很惊讶,尽管我无法操纵responde,但请求确实触及了Web服务器。
更令人惊讶的是,如果domain.com.br/log.php产生一个像1MB一样巨大的responde,我的萤火虫显示我浏览器确实从网络服务器下载了所有的1MB,并在最后显示一条消息“访问被拒绝“如预期。那么,为什么要下载所有的文件,如果相同的来源策略禁止读取数据。
最后,我让我感到惊讶的是,我读的所有网站和规范都说非常明确,当目标域与源域不匹配时,使用Ajax阻止请求。但显然,在我的实验中,尽管我无法访问响应数据,但请求正在完成。
让我不高兴的是它可能会打开一个大的安全漏洞,每天有数千个视图的网站可以运行这3行代码,并在不友好的网站中导致巨大的Ddos攻击,只是让用户请求因为浏览器不会阻止请求,所以会在很短的时间间隔内访问另一个网站。
我在IE 7,8和9中测试了这个脚本,并且Chrome的最新版本和Firefox的最新版本和行为是一样的:请求完成并且浏览器下载了所有的响应,而不是使它成为可执行的SOP。
希望有人可以解释为什么规范是如此错误或我是错误的理解!
[同源策略](http://www.w3.org/Security/wiki/Same_Origin_Policy):在同源策略下,跨站点发送信息也是危险的,因为它可以实现跨平台的攻击,网站请求伪造(CSRF)和点击劫持。由于禁止跨站点发送信息会禁止跨站点超链接,所以同源策略无法像接收信息那样解决这些安全漏洞。 **如果没有“允许发送”,根本就不会有“网络”,因为每个来源都只允许链接到自己。** – Andreas
@Andreas感谢您的帮助,但我想我可能不清楚。我承认,浏览器应该允许向外部域请求,比如嵌入图像,脚本,css表格......但是允许使用Ajax是一个巨大的威胁,因为可以针对任何Web服务器执行Dos攻击。规范总是说使用ajax向外部域发出的请求应该始终被阻止。这是错误的原因,因为我证明了,请求没有被阻止,只有响应。 – Samul
将行为与隐藏的iframe进行比较:如果来自其他域的内容不能在JavaScript中跨域访问,但iframe内容将“完全下载”。尽管我不确定XHR的具体情况,但似乎这种下载 - 然后块*与现有的启动受限制数据传输的方法相比,没有什么问题了。 – user2864740