为什么跨域JSONP安全,但跨域JSON不是?

时间:2011-08-18 17:07:22

标签: jsonp same-origin-policy cross-site

我无法连接最近学过JSONP的一些点。这是我的理解:

  • 由于源策略相同,禁止任何内容(包括JSON)的跨域XmlHttpRequests。这可以防止XSRF。
  • 您可以使用带有返回JSONP的src的脚本标记 - 在调用Javascript函数(例如'Foo')中填充一些JSON
  • 您可以在返回JSONP数据时调用的页面上执行'foo',并且可以使用传递函数的JSON数据执行操作

如果是通过JSONP接收跨域数据,为什么可以接收,但如果是通过JSON来获取则不行?

是否存在JSON容易允许XSRF但JSONP不允许的假设?如果是这样的话,除了JSONP之外,还有其他任何理由不能提供支持XSRF的数据 - 事实上的数据格式吗?为什么JSONP而不是XML上的一些任意根标记呢?

提前感谢您的回答,请在未能弄明白之后重新开始工作。

2 个答案:

答案 0 :(得分:10)

我理解这个问题是为什么浏览器认为JSONP是安全的,而不是它是否安全(它不是')。我会一步一步地解决这个问题。

常规ol' AJAX

要执行常规AJAX请求,浏览器会创建 XHR对象,将其指向URL并提取数据。 XHR对象仅信任来自同一域的数据。这是一个很难的限制。在当前浏览器中没有得到它(编辑 - 你现在可以使用CORS)。

解决方案 - 不要使用XHR

由于XHR受相同域的影响,我们无法使用XHR进行跨域AJAX 。幸运的是,还有其他方法可以命中远程服务器。例如,我们可以在页面上附加图像标记。我们还可以附加一个脚本标记,并为其指定一个指向远程服务器的src属性。例如,我们可以从CDN中提取JQuery并期望它能够正常工作。

JSONP如何运作。

当我们发出JSONP请求时,我们的代码会动态地将脚本标记附加到页面。 script标记有一个source属性,指向远程JSONP API url,就像从CDN插入脚本一样。

服务器返回的JSONP脚本包装在函数调用中。下载脚本后,该功能将自动执行。

这就是为什么我们必须告诉JSONP我们想要包装脚本的回调函数的名称。一旦脚本下载就会调用该函数。

安全问题

这里有一些相当大的安全问题。您下载的脚本可以控制您的页面并使您的用户面临风险。 JSONP对您的用户不安全,它不会被Web浏览器阻止。 JSONP确实是一个浏览器漏洞,我们正在利用。谨慎使用。

明智地使用,JSONP非常棒。

答案 1 :(得分:7)

我不知道JSONP的安全感如何出现但是看到了

  出于这个原因,JSON-P被许多人视为不安全和黑客   跨域Ajax的方法,并且有充分的理由。作者必须是   努力只对他们进行远程Web服务的调用   控制或隐含信任,以免受到用户的影响   伤害。

  

此提案中最关键的部分是浏览器供应商必须   开始对接收JSON-P的脚本标记强制执行此规则   内容,并抛出任何错误(或至少停止处理)   不符合JSON-P的内容。

来自http://json-p.org/的两个引号。

其他链接以及有关JSONP / security的一些有用信息:

所有这些都说明两件事 - 基本上它不被认为是“安全的”,但有关于如何使其“更安全”的想法......尽管大多数想法依赖于标准化和特定的检查逻辑构建到浏览器等。< / p>