我在连接最近了解 JSONP 的一些点时遇到了困难。这是我的理解:
- 由于同源政策,禁止任何内容(包括 JSON)的跨域 XmlHttpRequest。这可以防止 XSRF。
- 您可以使用带有返回 JSONP 的 src 的脚本标记 - 在对 Javascript 函数的调用中填充一些 JSON(例如“Foo”)
- 您可以在返回 JSONP 数据时调用的页面上实现“foo”,并且您可以使用函数传递的 JSON 数据执行操作
为什么 JSONP 可以接收跨域数据,而 JSON 则不行?
是否存在这样的假设:JSON 倾向于允许 XSRF 而 JSONP 则不允许?如果是这样,除了 JSONP 是某种事实上的数据格式,永远不会提供支持 XSRF 的数据之外,还有什么原因吗?为什么选择 JSONP 而不是 XML 上的任意根标记?
预先感谢您的回答,请在未能解决这个问题后让我的大脑再次运转。
我理解这个问题是关于为什么浏览器认为 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 是相当棒的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)