【发布时间】:2011-10-29 23:48:55
【问题描述】:
我在连接最近了解 JSONP 的一些点时遇到了问题。这是我的理解:
- 由于同源策略,禁止任何内容(包括 JSON)的跨域 XmlHttpRequest。这可以防止 XSRF。
- 您可以拥有一个带有返回 JSONP 的 src 的脚本标记 - 在调用 Javascript 函数(例如“Foo”)中填充了一些 JSON
- 您可以在页面上实现一些“foo”的实现,当 JSONP 数据返回时将被调用,并且您可以对函数传递的 JSON 数据执行操作
为什么跨域数据通过 JSONP 可以接收,但如果通过 JSON 就不行?
是否假设 JSON 倾向于允许 XSRF 而 JSONP 不是?如果是这样,除了 JSONP 是某种不会提供启用 XSRF 的数据的事实数据格式之外,还有什么理由吗?为什么选择 JSONP 而不是 XML 上的任意根标签?
提前感谢您的回答,请在无法弄清楚这一点后让我的大脑再次工作。
【问题讨论】:
-
JSONP 仅与提供 jsonp 文本的服务器一样安全。没有什么说 jsonp 服务器不能发送恶意代码/数据。 jsonp 纯粹用于绕过同源策略。它具有与常规 json 字符串相同的所有风险,以及作为实际 JS 代码的额外好处,而不仅仅是 js 数据。
-
我应该澄清我的明确问题。如果可以通过使用JSONP跨域检索JSON数据(当我说'安全'时,我的意思是浏览器允许它),为什么通过其他机制跨域检索JSON数据并不同样可以,例如XmlHttpRequest?
-
现在大多数浏览器都有一个原生 json 实现来编码/解码字符串,这没什么大不了的......但最初 json 支持是通过 eval() 完成的,所以你会正在运行返回的字符串,而不仅仅是处理它。
-
JSONP 只是一种自愿的 XSS 攻击。我们通过简单地从远程域注入脚本来绕过相同的来源限制。理论上,远程域可以使用此脚本来破解您的所有用户并完全控制您的站点。谨慎使用。
标签: jsonp same-origin-policy cross-site