未阻止跨域 AJAX 请求:这是安全漏洞吗?
Cross domain AJAX requests are not being blocked: is this a security vulnerability?
我花了3天时间研究如何使用XMLHttpRequest发出跨域请求。最好的选择确实是我已经使用的JSONP。
但我仍然有一个问题,我无处可寻。我阅读了数百篇帖子(包括 SO),没有人有一个好的答案(有很好的参考)。希望这里有人能帮忙。
话虽如此,我在许多网站上读到,由于安全原因,我无法从域 example.com 发出Ajax请求来 yyy.com 并获取我想要的数据。这很清楚,我对此没有任何疑问。但是问题是当我在我的本地主机中运行下面的代码时(所以我的域是"本地主机",我不应该能够从另一个域请求任何数据)。
xhReq = new XMLHttpRequest();
xhReq.open("GET","http://domain.com.br?parameter",true);
xhReq.send(null);
当我检查Firebug Net Tab时,我意识到请求没有被阻止!显然是有要求的。我简直不敢相信。因此,我在 domain.com.br/log.php 中创建了一个文件,您可以在其中记录任何命中我的域的请求。令人惊讶的是,我向本地主机发送的所有请求都击中了我的 domain.com.br。当我尝试获取响应时,由于我的 Chrome 和 FIrebug 浏览器的同源策略,我真的无法得到它。但我真的很惊讶,尽管我无法操纵响应,但请求真的击中了网络服务器。
更令人惊讶的是,如果 domain.com.br/log.php 生成了大约 1MB 的巨大响应,我的 firebug 向我显示浏览器确实从网络服务器下载了所有 1MB 的内容,最后它显示一条消息"访问被拒绝"如预期的那样。那么,如果同一源策略禁止读取该数据,为什么要下载所有文件。
最后,我让我感到惊讶的是,我阅读的所有网站和规范都非常清楚地表明,当目标域与源域不匹配时,使用 Ajax 阻止请求。但显然,通过我的实验,请求正在完成,尽管我无法访问响应数据。
让我沮丧的是,它可能打开了一个大的安全漏洞,其中每天有数千次浏览的网站可以运行这 3 行代码并在不友好的网站中引起巨大的 Ddos 攻击,只是让用户在短时间内请求另一个网站的页面,因为浏览器不会阻止请求。
我在IE 7,8和9以及Chrome late和Firefox latest 中测试了此脚本,行为是相同的:请求已完成,浏览器下载所有响应,同时无法执行SOP。
希望有人能解释为什么规格如此错误或我理解错误!
可以发出请求,并且服务器可以生成响应,而不管 CORS 如何。但是,响应可能会被隐藏。Balpha最近在他的博客中写道:
请注意,同源策略不一定会阻止请求本身 - 它只是阻止响应可访问。例如,恶意网站可以重定向您的浏览器,提交表单,或包含图像或iframe-在所有这些情况下,都会向您的网站发出请求;邪恶网站只是看不到响应。
在某种程度上,浏览器必须向服务器发出请求,以查看它是否服务器"访问控制-允许-源"标头。请记住,CORS 完全由浏览器实现。有人可以只编写一个控制台应用程序来向你的服务器发出请求,所以你不应该依赖 CORS 来确保请求只来自你自己的站点。
你可以用一个简单的图像文件达到同样的效果(就像你说的dos攻击),它不一定需要XHR。链接来自不同网站的图像文件,将数百万个图像文件放入您的页面中,将其显示给您的用户并蓬勃发展。
- 了解HTTP请求中的referr/referrer的安全方法是什么
- 如何使我的ajax请求更安全
- 未阻止跨域 AJAX 请求:这是安全漏洞吗?
- 哈希安全漏洞 - 如何修复
- Ajax是否像HTTP请求一样安全?
- 使用嵌入式 JS(CORS+AJAX 请求)跨域安全登录
- 内容安全策略阻止对 *://www.google.com/recaptcha/api 的请求
- 带有设置了安全标志的 cookie 的 GET 请求
- 通过ssl请求传递凭据是不安全的,什么'是更好的(KISS)解决方案
- 启用CORS时的安全漏洞
- 将javascript代码作为POST请求发送的安全方式是什么
- 将会话ID/密钥作为请求参数传递时存在安全风险
- 是不是;t JavaScript setTimeout和setInterval存在一些潜在的安全漏洞
- 是什么使访问系统剪贴板成为安全漏洞?
- 使用eval()来评估学生程序员的代码.安全漏洞
- AJAX登录的安全漏洞
- 为什么在JS中写入剪贴板被认为是一个安全漏洞
- 使用服务工作者阻止非安全http请求
- windows可以# 39;增强的安全漏洞jQueryUI's日期选择器
- 从NodeJS到Node/Express的安全POST请求挂起