JSON无法解决的问题:为什么这么严重?

时间:2013-02-06 06:49:30

标签: javascript json security

在阅读this问题之后,为什么google / facebook等添加了无法解析的内容:

  • while(1);
  • for(;;);
  • &&&START&&& ... &&&END&&&
  • 1和3合并
对他们的JSON回复,我已经明白了动机。但是,我仍然不清楚为什么使用这种相对复杂的机制,当用类似

之类的东西可以实现类似的效果时
  • 在开头添加额外的),使整个行无效,语法错误
  • 将JSON包装在评论中

现在,似乎这种无限循环和(奇怪的)语法错误的附加保护将是绕过旧的和允许的javascript解析器,但我似乎找不到任何引用,表明情况就是如此。还有另一个SO question继续解除while(1);解决方法(声明1可以被破坏)并拒绝另一种形式{}&&的解决方法,但不解释原因或引用任何来源。

其他参考资料:

2 个答案:

答案 0 :(得分:10)

我认为有几个与无法解释的形式相关的细节:

  • {}&&将日期添加回JSON解析器(显然是旧版本中的Dojo)并未将JSON字符串验证为有效JSON语法。我所知道的所有JSON Parser库现在都进行验证,但是2008年的this blog post表明dojo的所述版本通常允许JSON.parse json,而eval会{只是失败,这将为您提供方便的保护,防止JSON劫持。

  • while(1)可以使用Number原型无效,方法是将0指定为1的值。

  • for(;;)while(1)都会导致被劫持的网站崩溃,这会增加保护,因为任何脚本的每次进一步执行都会有效地停止而不会出现错误。这很重要,因为错误定义并不标记javascript中脚本执行的结束,而for(;;)确保后面没有任何脚本执行。这是为了防止(afaik hypothetical)攻击者通过利用window.onerror中的弱点,覆盖eval或代理错误对象实例化(如覆盖constructor {{}}来成功拦截脚本错误的情况1}})。

    <强>更新

    还有this question on security.stackexchange建议不要使用Error.prototypefor(;;),因为可能暗示您的网站是DoS攻击客户端CPU或触发恶意软件扫描程序。我没有看到现代浏览器存在严重的DoS问题,因为它们运行沙盒并且基于每个选项卡基础。但它肯定是旧版浏览器的问题。恶意软件扫描程序是一个真正的问题,可能会将您的网站报告为攻击。

  • while(1)(以及相应的&&&START&&&标记)使得接收json的客户端解析比仅使用&&&END&&&或可能无意中关闭的注释更容易,可以提高可读性和程序员的可见性。在评论中进行换行只是一种变体,因为它提供了)开头和/*结束标记。在我看来,在开始和结束时有一个清晰明确的标记有助于注意到残骸的意义。使用评论并没有真正提供。

答案 1 :(得分:3)

关于'1可以被破坏':

如果您执行以下操作(在webkit中):

var test = 1;
console.log(test.constructor == window.Number); //true is logged

理论上可能有一种方法可以修改window.Number或其原型,以便1的值不是1

window.Number.prototype.toString = function() { return 0 };
window.Number.prototype.valueOf = function() { return 0 }; 
幸运的是,这不起作用。但我认为这是作者试图说的。

修改 通常我也会倾向于使用将内容包装到注释中的方法(但是必须确保您的json对象不包含类似{"test":"*/"}的内容,因为这会产生语法错误。甚至抛出的错误可能是一个问题,如果它是可捕获的,可能会暴露一些关于错误发生的行的信息。或者错误对象本身可以被更改。