javascript - XMLHttpRequest 同源策略

标签 javascript ajax xmlhttprequest

最近三天我研究了如何使用 XMLHttpRequest 进行跨域请求。最好的选择确实是我已经在使用的 JSONP。

但我仍然有一个问题,我无法在任何地方找到答案。我阅读了数百篇文章(包括 SO),但没有人有一个负责任的好答案(有很好的引用)。希望这里有人可以提供帮助。

也就是说,我在许多网站上看到,由于安全原因,我无法从域 aaa.com 向 bbb.com 发出 Ajax 请求并获取我想要的数据。这很清楚,我对此毫无疑问。但问题是当我在我的本地主机中运行下面的代码时(所以我的域是“本地主机”,我不应该能够从另一个域请求任何数据)。

xhReq = new XMLHttpRequest();
xhReq.open("GET","http://domain.com?parameter",true);
xhReq.send(null);

当我检查 Firebug 网络选项卡时,我发现请求没有被阻止!这是明确要求的。我简直不敢相信。所以我在 domain.com/log.php 中创建了一个文件,我可以在其中记录任何访问我的域的请求。令人惊讶的是,我向 localhost 发出的所有请求都击中了我的 domain.com。当我试图获取响应时,由于我的 Chrome 和 FIrebug 浏览器的同源策略,我真的无法得到它。但令我感到非常惊讶的是,尽管我无法操纵响应,但请求确实到达了网络服务器。

更令人惊讶的是,如果 domain.com/log.php 生成一个巨大的响应,大约 1MB,我的 Firebug 告诉我浏览器确实从网络服务器下载了所有 1MB,最后它显示一条消息“访问被拒绝”正如预期的那样。那么,如果同源策略禁止读取该数据,为什么还要下载所有文件。

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

让我不高兴的是它可能会打开一个巨大的安全漏洞,每天有数千次浏览的网站可以运行这 3 行代码,并在一个不友好的网站中造成巨大的 Ddos 攻击,只是让用户请求一个页面由于浏览器不会阻止请求,因此会每隔一小段时间访问另一个网站。

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

希望有人能向我解释为什么规范如此错误或者我理解错误的地方!

最佳答案

发生这种情况是因为通过评估从服务器返回的以下访问控制 header 值,在客户端(浏览器)应用了同源策略:

  • 访问控制允许来源
  • 访问控制允许方法
  • 访问控制允许 header

如您所见,请求必须首先在服务器上完成,以便浏览器检查返回的 header 。这正是您的请求在服务器上执行的原因。

你可以看看Priciples of the Same-Origin Policy by A. Barth .

关于javascript - XMLHttpRequest 同源策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19673450/

相关文章:

javascript - Select2 在 ASP.Net UserControl 中不工作

javascript - 尝试在 javascript 函数中动态生成的输入框元素上应用 css 样式

javascript - innerHTML 从图像标签中删除结束斜线

javascript - HTML 转义从 ajax/json 返回的数据

javascript - AJAX 调用 python 函数不会从 Django 中的 JavaScript 函数发生

javascript - jQuery 触发 click vs click()?

javascript - jquery ajax 调用完成后如何推迟默认表单操作?

javascript - URL 重写和 Javascript HTTP 请求

javascript - CORS 以获取 .js 内容 - Javascript

python - XmlHttpRequest 请求元素为 None