2013-10-30 118 views
7

我花了最近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。

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

+2

[同源策略](http://www.w3.org/Security/wiki/Same_Origin_Policy):在同源策略下,跨站点发送信息也是危险的,因为它可以实现跨平台的攻击,网站请求伪造(CSRF)和点击劫持。由于禁止跨站点发送信息会禁止跨站点超链接,所以同源策略无法像接收信息那样解决这些安全漏洞。 **如果没有“允许发送”,根本就不会有“网络”,因为每个来源都只允许链接到自己。** – Andreas

+1

@Andreas感谢您的帮助,但我想我可能不清楚。我承认,浏览器应该允许向外部域请求,比如嵌入图像,脚本,css表格......但是允许使用Ajax是一个巨大的威胁,因为可以针对任何Web服务器执行Dos攻击。规范总是说使用ajax向外部域发出的请求应该始终被阻止。这是错误的原因,因为我证明了,请求没有被阻止,只有响应。 – Samul

+0

将行为与隐藏的iframe进行比较:如果来自其他域的内容不能在JavaScript中跨域访问,但iframe内容将“完全下载”。尽管我不确定XHR的具体情况,但似乎这种下载 - 然后块*与现有的启动受限制数据传输的方法相比,没有什么问题了。 – user2864740

回答

5

请求可以制作,服务器可以生成响应,而不管CORS如何。但是,响应可能会被隐藏。 balpha wrote about this in his blog最近:

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

在一定程度上,浏览器具有使向服务器发送请求以看它是否服务器的“访问控制允许来源”报头。请记住,CORS完全由浏览器实现。有人可以编写一个控制台应用程序向服务器发出请求,因此您不应该依赖CORS来确保请求只来自您自己的站点。

+0

感谢您的帮助。您提供的链接帮助但不是太多。问题是,无论我读什么,他们都说浏览器显示甚至不允许使用Ajax的请求。我知道,如果我将与外部src放在一起,它不仅会触发外部资源,而且还会下载它并显示响应,如图像。但是规格很清楚,请求不应该完成。这是一个安全威胁,因为我可以使用这3行代码来伤害任何网站,就像Dos攻击一样。 – Samul

+0

@Samul,但你可以在纯C控制台(尽管有超过3行)的应用程序中实现这3行代码,它绝对没有CORS的概念。让CORS阻止请求不会获得任何额外的安全性。 – vcsjones

+0

我同意你的意见。 CORS不会阻止Dos攻击,因为我可以在URL中附加GET参数,并且它总是看起来不一样,尽管CORS表示浏览器不应该再次请求该网站。尽管网页服务器发送了任何标题,但更改网址(甚至附加随机参数)将始终使浏览器请求外部资源。 – Samul

0

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

+0

你很对!但是众所周知,可以在页面中嵌入外部图像,脚本,css表单......但是也很明显,请求外部资源时应始终阻止Ajax请求。正如我证明的那样,只有响应被阻止。这里有一个潜在的威胁:使用Ajax我可以模拟一个POST做任何Web服务器登录并超载他们的数据库,这是我无法用图像处理的。 – Samul

+0

我不确定该政策是否要求拒绝该请求或访问权限。他们不同。不过,如果没有XHR,您仍然可以模拟任何网站发布到任何网站。创建表单,将操作设置为目标网站的登录页面。在页面加载时提交!这里你没有XHR发布的请求。 – regulus