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)中再现这些攻击。 同时,我无法确认现代浏览器解决这些问题的任何地方。
为了确保我不会因为任何可能的糟糕的编程技巧或者糟糕的Google搜索技巧而误导我:
今天在现代浏览器中,这些JSON劫持攻击仍然是一个问题吗?
(注意:对于可能的重复对不起,现在的浏览器有可能做'JSON劫持'吗?但是因为接受的答案似乎没有回答这个问题 - 我认为是时候再问一次,并得到一些更明确的解释。)
不,不可能捕获传递给Firefox 21,Chrome 27或IE 10中[]
或{}
构造函数的值。下面是一个基于http://www.thespanner中描述的主要攻击的测试页面.co.uk / 2011/05/30 / JSON劫持/:
(http://jsfiddle.net/ph3Uv/2/)
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);
});
});
<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>
链接地址: http://www.djcxy.com/p/1297.html