首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JSON劫持在现代浏览器中仍然是一个问题吗?

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

Stack Overflow用户
提问于 2013-04-30 07:28:45
回答 1查看 41K关注 0票数 160

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

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

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实际上是一个对象列表时,不必将JSON包装在对象中,这感觉更自然。

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

为了确保我既不会被糟糕的编程技能所误导,也不会被谷歌搜索技能所误导:

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

(注:很抱歉可能重复到:Is it possible to do 'JSON hijacking' on modern browser?,但由于接受的答案似乎没有回答问题-我认为是时候再问一次,并获得一些更清晰的解释。)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-02 13:54:24

不再可能捕获传递给Firefox21、Chrome27或IE10中的[]{}构造函数的值。

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

代码语言:javascript
复制
var capture = function() {
    var ta = document.querySelector('textarea')
	ta.innerHTML = '';
	ta.appendChild(document.createTextNode("Captured: "+JSON.stringify(arguments)));
	return arguments;
}
var original = Array;

var toggle = document.body.querySelector('input[type="checkbox"]');
var toggleCapture = function() {
    var isOn = toggle.checked;
    window.Array = isOn ? capture : original;
    if (isOn) {
        Object.defineProperty(Object.prototype, 'foo', {set: capture});    
    } else {
        delete Object.prototype.foo;
    }
};
toggle.addEventListener('click', toggleCapture);
toggleCapture();

[].forEach.call(document.body.querySelectorAll('input[type="button"]'), function(el) {
    el.addEventListener('click', function() {
        document.querySelector('textarea').innerHTML = 'Safe.';
        eval(this.value);
    });
});
代码语言:javascript
复制
<div><label><input type="checkbox" checked="checked"> Capture</label></div>
<div><input type="button" value="[1, 2]" /> <input type="button" value="Array(1, 2);" /> <input type="button" value="{foo: 'bar'}" /> <input type="button" value="({}).foo = 'bar';" /></div>
<div><textarea></textarea></div>

它覆盖了window.Array,并向Object.prototype.foo添加了一个设置器,并通过短格式和长格式测试初始化数组和对象。

在第1.5节中,ES4 spec“要求使用对象和数组的全局标准绑定来构造对象和数组初始值设定项的新对象”,并在实现先例中指出"Internet Explorer6、Opera9.20和Safari3不考虑对象和数组的局部或全局重新绑定,而是使用原始的对象和数组构造函数。“这将保留在ES5, section 11.1.4中。

Allen Wirfs-Brock explained指出,ES5还指定对象初始化不应触发setter,因为它使用DefineOwnProperty。MDN: Working with Objects指出,“从JavaScript 1.8.1开始,在对象和数组初始化器中设置属性时不再调用setter。”这是在V8 issue 1015中解决的。

票数 123
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16289894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档