我最近三天一直在学习如何使用XMLHttpRequest来进行跨域请求。目前最好的替代方法是JSONP,而我已经在使用了。
但是,我还有一个问题,在许多帖子(包括stackoverflow)中阅读了数百篇文章,没有人提供好的、可靠的答案(并带有良好的参考资料)。希望这里能有人能够帮助我。
话虽如此,我在许多网站上读到由于安全原因,我不能从 aaa.com 域向 bbb.com 进行Ajax请求并获取我想要的数据。这很清楚,我对此也没有疑问。但是,当我在本地主机上运行下面的代码时(所以我的域名是“localhost”,我不应该能够从另一个域请求任何数据),问题就出现了。
xhReq = new XMLHttpRequest();
xhReq.open("GET","http://domain.com?parameter",true);
xhReq.send(null);
当我检查Firebug Net标签时,我意识到请求并没有被阻塞!它明显被请求了。我简直不敢相信。所以我在domain.com/log.php中创建了一个文件,我可以记录任何访问我的域名的请求。令人惊讶地是,我发送到localhost的所有请求都会命中我的domain.com。当我尝试获取响应时,由于Chrome和Firebug浏览器的同源策略,我确实无法获得响应。但我真的很惊讶,因为请求确实命中了Web服务器,尽管我无法操作响应。
更令人惊讶的是,如果domain.com/log.php生成一个巨大的响应,例如1MB,我的Firebug会显示浏览器从Web服务器下载了全部1MB,并在最后显示“Access denied”消息,正如预期的那样。那么,如果同源策略禁止读取数据,为什么下载整个文件呢?
最后,让我感到惊讶的是,我阅读的所有网站和规范都非常明确地说,当目标域与源域不匹配时,Ajax会阻止请求。但是,通过我的实验,很明显请求已经完成了,尽管我无法访问响应数据。
让我不安的是,这可能会打开一个巨大的安全漏洞,一个每天有数千次浏览量的网站可以运行这3行代码,并在小间隔中使用户请求其他网站的页面,因为浏览器不会阻止请求。
我在IE 7、8和9以及最新版本的Chrome和Firefox中测试了这个脚本,行为都是相同的:请求已完成,浏览器下载了所有响应,但没有使其对SOP可用。
希望有人能解释一下为什么规范这么错误或者我理解错了什么!
domain.com
是否已启用了CORS,但如果启用了,IE应该无法使用... 无论如何,你能确认一下吗? - Arun P Johny