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

Javascript JSON劫持在现代浏览器中仍然是一个问题吗?,javascript,json,security,browser,tornado,Javascript,Json,Security,Browser,Tornado,我正在使用Backbone.js和Tornado web服务器。主干网中接收收集数据的标准行为是作为JSON数组发送 另一方面,由于以下漏洞,Tornado的标准行为是不允许JSON数组: 一个相关的例子是: 对于我来说,当JSON实际上是一个对象列表时,不必将它封装在一个对象中感觉更自然 我无法在现代浏览器(即当前的Chrome、Firefox、Safari和IE9)中重现这些攻击。与此同时,我无法确认现代浏览器是否解决了这些问题 为了确保我不会被任何可能的糟糕编程技能或糟糕的谷歌搜索技能

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

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

一个相关的例子是:

对于我来说,当JSON实际上是一个对象列表时,不必将它封装在一个对象中感觉更自然

我无法在现代浏览器(即当前的Chrome、Firefox、Safari和IE9)中重现这些攻击。与此同时,我无法确认现代浏览器是否解决了这些问题

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

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


(注意:很抱歉可能重复到:但由于接受的答案似乎没有回答问题-我想是时候再问一遍并得到一些更清楚的解释了。)

不,在Firefox21、Chrome 27或IE 10中,不再可能捕获传递给
[]
{}
构造函数的值。下面是一个小测试页面,基于中描述的主要攻击:

()

var capture=function(){
var ta=document.querySelector('textarea')
ta.innerHTML='';
appendChild(document.createTextNode(“捕获:+JSON.stringify(参数)));
返回参数;
}
var原始=数组;
var toggle=document.body.querySelector('input[type=“checkbox”]”);
var toggleCapture=function(){
var isOn=toggle.checked;
window.Array=isOn?捕获:原始;
国际单项体育联合会{
Object.defineProperty(Object.prototype,'foo',{set:capture});
}否则{
删除Object.prototype.foo;
}
};
toggle.addEventListener('click',toggleCapture);
切换捕捉();
[].forEach.call(document.body.queryselectoral('input[type=“button”]”),函数(el){
el.addEventListener('click',函数(){
document.querySelector('textarea')。innerHTML='Safe';
eval(该值);
});
});
捕获

使用eval?如果主干解析响应的方式没有任何改变,那么您应该是安全的。一般来说,您不应该假设有人将使用“现代”浏览器来处理web安全问题。@Luke-请参阅下面对Reid的评论。总的来说,这一点很重要——但我不是在问一般的安全问题。(我的用户只有在首先使用现代浏览器的情况下才能进行身份验证。)@Luke,有时我们必须继续前进,让我们能够使用现代模式进行开发(例如在本例中的REST:获取数据是一个GET操作,不应该是其他操作)如果这些威胁现在看来只适用于一小部分受众,那么它们就无法抵御旧的威胁。因此,这个问题非常有价值,可以让一个人评估他是否可以在他的应用案例中忽略这个威胁。在某种程度上,使用非常过时的软件的用户很可能会受到其他类型的威胁(恶意软件),我们无论如何都无法保护他们。@jpaugh,你在哪里看到这样的假设?我只是在某种程度上认为那些使用这种过时软件的人无论如何都是“不受保护的”。(关于证明我的溜冰鞋价格合理的问题,我已经习惯于把它们价格的三分之一放在碳纤维速滑鞋上,而在我穿完目前的溜冰鞋不到三分之一的时间里,它们就已经磨损了。无论如何,我认为它们是值得的,只要你喜欢骑它们,这就是我的情况。)早在2009年,Brendan Eich就建议浏览器不要评估用作application/json()的脚本,这对我来说仍然是个好主意。请注意,盲后CSRF仍然可以使用表单,特别是文本/纯编码,需要使用令牌/nonce来克服。是的,后CSRF。感谢您在这里提供的所有精彩信息。当您的语句只涉及简单地覆盖数组构造函数时,它是正确的。不过,微软IE和Edge仍然容易受到UTF-7 JSON劫持的攻击。最近对它进行了测试(今天又是为了好玩),它仍然有效。UTF-16BE也是如此,多亏了Gareth Heyes,