JSON劫持在现代浏览器中仍然是个问题吗?
我正在使用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)中再现这些攻击。 同时,我无法确认现代浏览器已经解决了这些问题的任何地方。
为了确保我不会被任何可能的糟糕的编程技巧或不良的Googlesearch技巧误导:
这些JSON劫持攻击今天在现代浏览器中仍然是个问题吗?
(注意:对于可能的重复对不起, 现在的浏览器有可能做'JSON劫持'吗?但是由于接受的答案似乎没有回答这个问题 – 我想是时候再问一遍,得到一些更清楚的解释。)
不,不可能捕获传递给Firefox 21,Chrome 27或IE 10中[]
或{}
构造函数的值。下面是一个testing页面,基于http://www.thespanner中描述的主要攻击.co.uk / 2011/05/30 / json-hijacking / :
它覆盖window.Array
,并将一个setter添加到Object.prototype.foo
,并通过short和longformstesting初始化数组和对象。
第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解决了这个问题 。