我花了最后3天研究如何使用XMLHttpRequest发出跨域请求。最好的替代方案确实是我已经使用的JSONP。
但我还有一个问题,我无法找到答案。我阅读了数百个帖子(包括SO),没有人有一个很好的可靠回答(很好的参考)。希望有人可以提供帮助。
说,我在许多网站上读到,由于安全原因,我无法从域aaa.com向bbb.com发出Ajax请求并获取我想要的数据。这很清楚,我对此毫无疑问。但问题是当我在我的localhost中运行下面的代码时(所以我的域名是“localhost”,我不应该从另一个域请求任何数据)。
xhReq = new XMLHttpRequest();
xhReq.open("GET","http://domain.com?parameter",true);
xhReq.send(null);
当我检查Firebug Net选项卡时,我发现请求未被阻止!明确要求。我简直不敢相信。所以我在domain.com/log.php中创建了一个文件,在那里我可以记录任何访问我域名的请求。令人惊讶的是,我解雇localhost的所有请求都是我的域名网站。当我尝试获取响应时,由于我的Chrome和FIrebug浏览器的原始策略相同,我实在无法得到它。但令我感到惊讶的是,尽管我无法操纵响应,但该请求确实打到了网络服务器。
更令人惊讶的是,如果domain.com/log.php生成了大约1MB的响应,我的firebug告诉我浏览器确实从网络服务器下载了所有1MB,最后它显示了一条消息“拒绝访问”正如所料。因此,如果相同的原始策略禁止读取该数据,为什么要下载所有文件。
最后,我让我惊讶的是,我读到的所有网站和规范都说明了当目标域与源域不匹配时使用Ajax阻止请求。但显然,通过我的实验,尽管我无法访问响应数据,但请求仍在完成。
令我不安的是,它可能会打开一个大的安全漏洞,每天有数千个视图的网站可以运行这个3行代码并在一个不友好的网站上引起巨大的Ddos攻击只是让用户请求一个页面因为浏览器不会阻止请求,所以在另一个网站中间隔很小。
我在IE 7,8和9以及Chrome最新和Firefox最新版本中测试了此脚本,行为是相同的:请求已完成,浏览器会下载所有响应,而不会使其无法执行SOP。
希望有人可以解释为什么规格错误或我理解错误!
答案 0 :(得分:2)
这是因为通过从服务器评估以下访问控制标头值返回,在客户端(浏览器)上应用了相同的源策略:
如您所见,必须首先在服务器上完成请求,以便浏览器检查返回的标头。这正是您的请求在服务器上执行的原因。
答案 1 :(得分:2)
在类似问题上查看bobince's answer:
根据XMLHttpRequest级别2,浏览器允许跨源GET 没有飞行前检查发送,但不允许读取结果 响应,除非远程域选择。没有额外的 这里的漏洞,因为你已经可以导致任意的GET 要发送的URL(包括查询字符串,它的价值) 多个更基本的接口。
例如,您始终可以使用创建元素 它的src设置为远程域上的地址;拿走那个 跨域能力会打破很多现有的网络。
相关: