javascript - 为什么没有 CORS 的 Ajax GET 请求被阻止,但允许 JSONP?

标签 javascript ajax security cors

我们可以简单地使用来自另一个来源的 html 标签对网络上的任何页面调用 GET 请求:

<script src="http://example.com/user/post?txt=sample"></script>

由于安全原因 XHR 其他来源被阻止,例如,攻击者可以使用 GET 请求代表用户发布(考虑到由于缺少 cookie 而不可能的事实)。然而,上面的脚本标签会做同样的事情(同样,cookies 不可用)。 那么为什么不允许 XHR GET 请求?

最佳答案

GET 请求不应更改服务器上的任何内容。来自 RFC 2616 section 9.1.1 :

In particular, the convention has been established that the GET and HEAD methods SHOULD NOT have the significance of taking an action other than retrieval. These methods ought to be considered "safe".

在您使用 GET 请求发布到网站的示例中,该网站甚至不应该允许这样做,并且同源策略并不是真的要阻止它。

XHR 被区别对待的原因是 XHR 将 HTTP 响应返回给发出请求的 JavaScript 代码,因此它有可能泄露信息。例如,如果允许跨域 XHR GET 请求,则恶意脚本可以查询您银行的网站以查明您的帐户中有多少钱。

执行 GET 请求的其他方法不会泄露信息。特别是:

  • 您可以添加 <script>标记到文档,但浏览器将尝试将响应作为脚本运行。除非响应是专门设计使用 JSONP 约定提供数据的有效脚本,否则您的代码无法“看到”响应中的任何内容。
  • 您可以添加 <img>标记到文档并可能从另一个站点加载一些用户的个人照片,但图像只会出现在屏幕上;您无法从 JavaScript 访问像素数据。

关于javascript - 为什么没有 CORS 的 Ajax GET 请求被阻止,但允许 JSONP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23722376/

相关文章:

javascript - 使用 JS 的多重过滤表

javascript - 使用 Node.js 将 URL 字符串发送到其他脚本

javascript - ASP.NET MVC : Create Crawlable link tags from rendered pager

javascript - 将 `toDataURL` 图像保存到服务器

c# - 异步加载 Orchard 自定义小部件

javascript - 使用 IF 和 WHILE 在 JavaScript 中递归

javascript - 如何将数据从选中的数据表发送到另一个页面复选框

Android - 隐藏 API clientId 和 clientSecret 的最佳方式

java - PBEWithSHAAnd128BitRC4在java中的实现

java - 如何以编程方式将私钥添加到 Windows 证书存储