您是否希望将JSON数组包装在另一个JSON对象中,或者总是需要POST以防止JSON劫持?

Osc*_*hed 9 security json

我最近开始研究使用.NET MVC构建Web应用程序,我偶然发现了Phil Haack的这篇博文:JSON Hijacking.对于那些在使用JSON传输敏感数据时不了解此漏洞的人来说,这是必须阅读的.

似乎有三种方法可以处理此漏洞.

  1. 在JSON服务中需要POST而不是GET.
  2. 将JSON数组响应包装在JSON对象中.
  3. 不要在任何不受1或2保护的服务中公开敏感数据.

第三种选择并不是真正的选择,因为它确实限制了JSON的使用.

那么你更喜欢其他两个中的哪一个?

默认情况下,.NET MVC 2预览需要POST for JSON响应,我认为这是保护尚未了解此问题的任何开发人员的好方法.但对我而言,以这种方式打破REST感觉有点"hacky".除非有人用我说话,否则我会坚持将我的数组包装在另一个对象中并将其展开到客户端.

bob*_*nce 7

我亲自将我的所有回复包括在评论中:

/* {
    "foo": 3,
    "bar": "string with *\x2F sequence in"
} */
Run Code Online (Sandbox Code Playgroud)

并在JSON.parsing之前将其删除.这使得它无法用作脚本标记的目标.

值得注意的是,这个问题不仅与JSON有关,而且与您提供的任何可以解释为JavaScript的HTTP响应有关.即使是一个.htaccess保护的文本文件也很容易通过第三方脚本标记包含泄漏,如果它的格式恰好是有效的JavaScript.

这就是危机:感谢E4X,即使是普通的静态XML文档也是有效的JavaScript.E4X是一个灾难性的,无用的JavaScript扩展,在Mozilla上实现和发明,它允许你<element>content</element>在JS中内联编写XML文字; 因此,受保护的XML文件现在容易受到与JSON相同的跨站点泄漏风险的影响.谢谢Mozilla.请参阅Google doctype的相关文章.