Javascript 为什么不带CORS的Ajax GET请求被阻止,但允许JSONP?

Javascript 为什么不带CORS的Ajax GET请求被阻止,但允许JSONP?,javascript,ajax,security,cors,Javascript,Ajax,Security,Cors,我们只需使用另一个来源的html标记调用web上任何页面的GET请求: <script src="http://example.com/user/post?txt=sample"></script> XHR other origin因安全原因而被阻止,例如,攻击者可以使用GET请求代表用户发布(请考虑由于缺少cookie而无法发布的事实)。但是,上面的脚本标记也会这样做(同样,cookies不可用)那么为什么不允许XHR GET请求呢?GET请求不应该更改服务器上的

我们只需使用另一个来源的html标记调用web上任何页面的GET请求:

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


XHR other origin因安全原因而被阻止,例如,攻击者可以使用GET请求代表用户发布(请考虑由于缺少cookie而无法发布的事实)。但是,上面的脚本标记也会这样做(同样,cookies不可用)那么为什么不允许XHR GET请求呢?

GET请求不应该更改服务器上的任何内容。发件人:

特别是,已经确定GET和HEAD方法不应具有采取检索以外的操作的意义。这些方法应该被认为是“安全的”

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

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

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

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

@Kousha:对于AJAX提供的敏感信息,只有启用POST方法可能是明智的,以防止出现错误。这个bug只在旧浏览器(例如Firefox3)中可能出现——你永远不知道类似的东西是否会再次出现。可能不会,但仅仅发布帖子的成本很低,因此作为一道额外的防线可能是值得的。@Wyzard,关于你的最后一段,你难道不能阅读
标签的大小来确定响应的大小吗?@Pacerier,你不清楚标签的“大小”是什么意思。如果查看
属性(即URL)。没有任何信息可以告诉您从该URL检索到的资源的大小。对于图像(不是脚本),您可以从JS获取宽度和高度,但这通常不是敏感信息。@Wyzard,等等,可以吗?另外,脚本元素的
innerHTML
正是DOM中的内容:介于
标记之间的文本。
src
属性引用的代码未放入DOM中,无法通过
innerHTML
查看。