27

我无法连接最近了解 JSONP 的一些点。以下是我的理解:

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

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

是否存在 JSON 倾向于允许 XSRF 而 JSONP 不是的假设?如果是这样,除了 JSONP 是某种不会提供启用 XSRF 的数据的事实数据格式之外,还有什么理由吗?为什么选择 JSONP 而不是 XML 上的任意根标签?

提前感谢您的回答,请在无法弄清楚这一点后让我的大脑再次工作。

4

2 回答 2

10

我理解这个问题是关于为什么浏览器认为 JSONP 安全,而不是关于它是否安全(它不是)。我将逐步解决这个问题。

普通的 AJAX

为了执行常规的 AJAX 请求,浏览器创建一个XHR 对象,将其指向 URL 并提取数据。XHR 对象将只信任来自同一域的数据。这是一个硬性限制。在当前的浏览器中无法绕过它(编辑 - 您现在可以使用 CORS)。

解决方案 - 不要使用 XHR

由于 XHR 受制于相同的域策略,因此我们不能使用 XHR 进行跨域 AJAX。幸运的是,还有其他方法可以访问远程服务器。例如,我们可以将图像标签附加到页面。我们还可以附加一个脚本标签,并给它一个指向远程服务器的 src 属性。例如,我们可以从 CDN 中提取 JQuery 并期望它能够工作。

JSONP 的工作原理。

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

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

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

安全问题

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

明智地使用,JSONP 非常棒。

于 2014-05-29T07:05:14.577 回答
7

我不知道 JSONP 是安全的看法是如何产生的,但请看

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

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

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

其他包含有关 JSONP/安全性的有用信息的链接:

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

于 2011-08-18T17:25:44.243 回答