JSON劫持在现代浏览器中仍然是个问题吗?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (11)

我正在使用Backbone.js和Tornado Web服务器。在Backbone中接收集合数据的标准行为是作为JSON数组发送。

另一方面,由于以下漏洞,Tornado的标准行为是不允许JSON Array:

http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx

相关的一个是:http : //haacked.com/archive/2009/06/25/json-hijacking.aspx

对于我来说,当它真的是一个对象列表时,不必将我的JSON包装在一个对象中,这感觉更自然。

我无法在现代浏览器(即当前的Chrome,Firefox,Safari和IE9)中再现这些攻击。同时,我无法确认现代浏览器解决这些问题的任何地方。

为了确保我不会被任何可能的糟糕的编程技巧或不良的Google搜索技巧所误导:

今天在现代浏览器中,这些JSON劫持攻击仍然是一个问题吗?

提问于
用户回答回答于

不,这是不再可能捕捉传递给值[]{}构造在Firefox 21,Chrome浏览器27或IE 10。这里有一个小测试页,根据所描述的主要攻击http://www.thespanner.co.uk / 2011/05/30 / json-hijacking /

http://jsfiddle.net/ph3Uv/2/

它覆盖window.Array并添加一个setter,Object.prototype.foo并通过short和long形式测试初始化​​数组和对象。

第1.5节中的ES4规范 “要求对象和数组的全局标准绑定用于构造对象和数组初始化器的新对象”,以及Implementation Precedent中的注释:“Internet Explorer 6,Opera 9.20和Safari 3可以不尊重对象和数组的本地或全局重新绑定,而是使用原始的对象和数组构造函数。“ 这在ES5第11.1.4节中保留。

Allen Wirfs-Brock解释说ES5还指定对象初始化不应该触发setter,因为它使用DefineOwnProperty。MDN:使用对象注意到:“从JavaScript 1.8.1开始,在对象和数组初始化器中设置属性时,不再调用setter。” V8问题1015解决了这个问题

扫码关注云+社区