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

Javascript 未阻止跨域AJAX请求:这是一个安全漏洞吗?,javascript,ajax,http,cross-domain,Javascript,Ajax,Http,Cross Domain,我花了3天时间研究如何使用XMLHttpRequest进行跨域请求。最好的选择是使用我已经在使用的JSONP 但我仍然有一个问题,我找不到答案。我读了数百篇帖子(包括SOs),但没有人有一个好的可靠答案(有很好的参考)。希望这里有人能帮忙 尽管如此,我在许多网站上看到,由于安全原因,我无法从domain example.com向yyy.com发出Ajax请求并获取所需数据。这很清楚,对此我没有疑问。但问题是当我在本地主机中运行下面的代码时(因此我的域是“localhost”,我不能从另一个域请求

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

但我仍然有一个问题,我找不到答案。我读了数百篇帖子(包括SOs),但没有人有一个好的可靠答案(有很好的参考)。希望这里有人能帮忙

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

当我检查Firebug Net选项卡时,我意识到请求没有被阻止!这是明确要求的。我简直不敢相信。因此,我在domain.com.br/log.php中创建了一个文件,可以在其中记录任何涉及我的域的请求。令人惊讶的是,我触发的所有localhost请求都击中了我的domain.com.br。当我试图获取响应时,由于Chrome和FIrebug浏览器的同源策略,我真的无法获得响应。但是我真的很惊讶,尽管我无法操纵响应,请求却真的击中了Web服务器

更令人惊讶的是,如果domain.com.br/log.php以1MB的速度生成巨大的响应,我的firebug向我显示浏览器确实从Web服务器下载了所有1MB的数据,并在最后显示了一条消息“访问被拒绝”,正如预期的那样。那么,如果同源策略禁止读取数据,为什么要下载所有文件呢

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

让我不安的是,这可能会打开一个很大的安全漏洞,每天有数千次访问的网站可能会运行这3行代码,并在一个不友好的网站上造成巨大的Ddos攻击,只是让用户在短时间内请求另一个网站的页面,因为浏览器不会阻止请求

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

希望有人能解释为什么规格是如此的错误,或者我的理解是错误的

可以发出请求,并且服务器可以生成响应,而不考虑COR。但是,响应可能是隐藏的。巴尔法最近:

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


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

您可以通过一个简单的图像文件实现相同的效果(就像您所说的dos攻击),它不一定需要是XHR。从不同的网站链接一个图像文件,将数百万的图像文件放到你的页面中,向你的用户显示,然后爆炸

:在同源策略下,跨站点发送信息也很危险,因为它会导致跨站点请求伪造(CSRF)和点击劫持等攻击。同源策略无法以与接收信息相同的方式解决这些安全漏洞,因为禁止跨站点发送信息将禁止跨站点超链接。如果没有“允许发送”,就不会有“网络”,因为每个来源只能链接到自己。@Andreas谢谢你的帮助,但我想我可能不太清楚。我理解浏览器应该允许对外部域的请求,比如嵌入图像、脚本、css表。。。但是,允许使用Ajax是一个巨大的威胁,因为Dos攻击可以对任何Web服务器执行。规范总是说使用ajax向外部域发出的请求应该始终被阻止。这是错误的,因为正如我所证明的,请求没有被阻止,只有响应。将行为与隐藏的iframe进行比较:如果内容来自另一个域,则无法在JavaScript中跨域访问,但iframe内容将“完全下载”。虽然我不确定XHR的具体细节,但似乎这个下载then块与启动受限数据传输的现有方法相比并不是一个问题。。。else没有关于停止发送请求的任何信息谢谢您的帮助。你提供的链接有帮助,但不是太多。问题是,无论我读到哪里,他们都说浏览器显示甚至不允许使用Ajax进行请求。我知道,如果我使用外部src,它不仅会访问外部资源,还会下载它,并显示像图像一样呈现的响应。但是规格很清楚,这个请求不应该完成。这是一种安全威胁,因为我可以像Dos攻击一样使用这三行代码伤害任何网站。@Samul但你可以在一个完全没有CORS概念的普通C控制台(尽管有三行以上)应用程序中实现这三行代码。让CORS阻止请求不会获得任何额外的安全性。我同意你的看法。CORS不阻止
xhReq = new XMLHttpRequest();
xhReq.open("GET","http://domain.com.br?parameter",true);
xhReq.send(null);