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

时间:2014-05-18 13:21:59

标签: javascript ajax security cors

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

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

XHR其他来源因安全原因被阻止,作为一个例子,攻击者可以使用GET请求代表用户发帖(考虑到由于缺少cookie而无法实现)。但是,上面的脚本标记也会这样做(相同,cookie不可用)。 那么为什么不允许XHR GET请求?

1 个答案:

答案 0 :(得分:3)

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

  

特别是,已经确定了GET和HEAD方法不具有采取除检索之外的动作的重要性的约定。这些方法应该被认为是安全的&#34;。

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

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

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

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