JSONP可以安全使用吗?

时间:2009-03-05 08:24:57

标签: security json jsonp

使用JSONP时是否应该考虑任何安全问题?

4 个答案:

答案 0 :(得分:65)

更新:JSONP是执行跨域请求的常见攻击。现代浏览器现在具有跨源资源共享,而IE8 +具有类似的XDomainRequest。有关详细信息,请参阅http://enable-cors.org/

JSONP只是一个允许您使用回调的脚本包含。但是,您应该了解Cross-site request forgery (CSRF)

只要您控制脚本和服务器,JSONP就不再是脚本包含的不安全。除非您有一个JSONP服务将敏感数据返回给登录用户。恶意站点可以向服务发送请求(希望用户登录到您的站点),并检索数据。该服务可以检查请求的引用者,但可以使用flash欺骗引用者(感谢Chris Moschini)。

想象一下这句话:   - 用户登录他的网上银行账户。在用户浏览器中存储会话cookie。该站点有一个jsonp服务,其中包含有关用户及其帐户的敏感信息。   - 其他网站不会知道用户已登录,但他们可以做一个疯狂的猜测并尝试访问jsonp服务。由于用户有一个会话cookie,浏览器将得到一个响应,没有什么能阻止该网站做一个ajax帖子将敏感数据保存在他们的服务器上。

2012年6月28日更新:如果您想要防范CSRF攻击,您应该阅读安全专家的博客文章:http://erlend.oftedal.no/blog/?blogid=130

答案 1 :(得分:21)

是的,您需要小心,但如果与可信服务一起使用,则相对安全。

以下是JSONP的安全问题摘要,据我所知:

从消费者的角度来看:

  • 您必须相信提供程序不会返回恶意JavaScript,而不是您指定的JSONP回调中包含的预期JSON。
  • 任何第三方JavaScript嵌入式附加组件也是如此,例如Google Analytics。
  • 它只与XSS攻击相似,它允许第三方在您的应用程序中执行任意JavaScript,但是,您必须首先通过首先发出请求来选择信任该第三方。

从提供者的角度来看:

  • 您不能假设即使客户的cookie存在于请求中,消费者是您控制的网页。根据授权URL的白名单检查Referer标头,和/或不依赖基于cookie的身份验证。
  • 类似于CSRF /混乱的副攻击。

答案 2 :(得分:12)

双方都存在安全问题。最严重的是网站,包括JSONP。

如果您要包含来自其他域(您无法控制)的域,则该域可以随时更改脚本。他们可以使javascript在您的网页上下文中执行任何操作,您自己的javascript可以执行此操作。如果您使用JSONP,则无法解决此问题。您应该考虑使用iframe进行跨域通信,最好由优秀的EasyDXM库完成。

如果您提供处理JSONP的Web服务,则必须防止跨站点请求伪造(CSRF)。这是您的Web服务将敏感信息返回给登录用户的位置。如果用户已登录到您的站点,则任何其他站点都可以生成对JSONP服务的GET请求,并且您的域的cookie随请求一起提交 - 实质上是对登录用户进行身份验证 - 除了现在,远程域获取响应并能够读取敏感数据!

防止CSRF的最佳方法是生成随机数(难以猜测,随机生成的数字)并将其存储在会话中。在您的网页上的所有表单中输出此随机数,并将其包含在您网页上的所有JSONP请求中。在服务器上,确保请求中的nonce存在且正确(无论是GET,POST等)。其他域将无法猜测此nonce,因此无法获取敏感信息,尽管cookie被送了。

最后,还有另一种安全问题:JSONP根本不支持浏览器中的用户身份验证,这种功能可以通过OAuth实现。当然,您可以让服务器获得某种访问令牌(如OAuth)并使用它。但是,如果要完全在浏览器中进行身份验证,则必须使用与iFrame的跨域通信。我认为这就是OAuth 2.0的作用。以下是您设置的方式:您网站上托管的网页可以完全访问您的服务器。有一个JavaScript库,可以加载EasyDXM并使用它来为您的网站设置一个隐藏的iframe,并使用它进行交谈。

答案 3 :(得分:3)

JSONP绝对不安全,因为它只是运行任何跨域的JavaScript。

<强>溶液!溶液<!/强>

创建一个iframe,最好是一个沙盒,并在那里加载JSONP。抓住结果并通过window.postMessage

传递

是的,有人像往常一样首先得到这个想法:)

博客文章不再存在,但我在此处保留链接以获取信用: http://beebole.com/blog/general/sandbox-your-cross-domain-jsonp-to-improve-mashup-security/
编辑:wayback machine link

它使用window.name hack进行iframe通信,但那是针对IE6和7。