JSONP安全使用?

使用JSONP时是否有任何安全问题需要考虑?

更新 :JSONP是一个常见的黑客做跨域请求。 现代浏览器现在具有跨源资源共享,并且IE8 +具有类似的XDomainRequest。 请参阅http://enable-cors.org/了解更多信息。;

JSONP只是一个脚本包含,允许您使用callback。 但是,您应该了解跨站请求伪造(CSRF) 。

只要你控制脚本和服务器,JSONP不再比脚本包含的不安全。 除非您有将敏感数据返回给login用户的JSONP服务。 恶意网站可以向服务发送请求(希望用户在您的网站上login),并检索数据。 该服务可以检查请求的引用者,但是可以使用Flash来欺骗引用者(感谢Chris Moschini)。

想象一下这个senario: – 用户login到他的网上银行帐户。 将会话cookie存储在用户浏览器中。 这个网站有一个关于用户和他的帐户的敏感信息jsonp服务。 – 其他网站不知道用户login,但他们可以做一个疯狂的猜测,并尝试访问jsonp服务。 由于用户有一个会话cookie,浏览器将得到一个响应,没有什么能阻止网站做一个ajax文章来保存敏感数据在他们的服务器上。

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

是的,你需要小心,但是当与可靠的服务正确使用它是相对安全的。

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

从消费者的angular度来看:

  • 您必须相信提供者不会返回恶意JavaScript,而不是返回您指定的JSONPcallback中包含的预期JSON。
  • 任何第三方JavaScriptembedded式附件(例如Google Analytics)也是如此。
  • 这与XSS攻击类似,它允许第三方在您的应用程序中执行任意JavaScript,但是您必须首先通过提出请求来select信任第三方。

从提供者的angular度来看:

  • 即使客户的Cookie存在于您的控制网页的请求中,您也不能认为。 检查Referer标头与授权URL的白名单,和/或不要依赖基于cookie的authentication。
  • 类似于CSRF /混淆的副攻击。

双方都有安全问题。 其中最严重的是包括JSONP在内的网站。

如果您包含来自另一个域(您不能控制)的域,则该域可以随时更改该脚本。 他们可以让JavaScript做任何事情在你的网页上下文,你自己的JavaScript可以做的。 如果您使用JSONP,则无法解决此问题。 您应该考虑使用iframe进行跨域通信,最好由EasyDXM库完成。

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

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

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

解! 解!

我得到这个想法,有一个iframe跨域攻击,不执行代码,但让你传递一个variables。 为什么不使用它来保证安全? …

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

http://beebole.com/blog/general/sandbox-your-cross-domain-jsonp-to-improve-mashup-security/

还有window.postMessage,这是安全的,不hacky