JSON无法解析的克鲁夫特:为什么这么严重?(JSON unparseable cruft: Why

2019-07-19 08:45发布

看完这个问题,为什么谷歌/ Facebook的等添加无法解析的克鲁夫特,如:

  • while(1);
  • for(;;);
  • &&&START&&& ... &&&END&&&
  • 图1和3相结合

他们的JSON响应,我已经明白的动机。 但我仍然不清楚为什么这样相对复杂的机制被使用,当类似的效果可以用之类的东西来实现

  • 增加一个额外的)开头渲染无效的整条生产线有语法错误
  • 包裹在评论JSON

现在看来,这增加了一个无限循环和(怪异)语法错误的保护,就会得到解决老年人和宽容的JavaScript解析器,但我似乎无法找到,表明这种情况下的任何引用。 还有另一种SO问题即进到甚至迪斯while(1); 解决方法(说明1可被打一顿)和拒绝表单的另一个解决办法{}&& ,但并不能解释为什么或引用任何来源。

其他参考资料:

  • http://code.google.com/p/fbug/issues/detail?id=369
  • http://prototypejs.org/learn/json ,这表明一个包裹在JSON /*-secure-\n...*/

Answer 1:

我认为有相关的无法解析的克鲁夫特的形式几个细节:

  • {}&&前缀的历史可以追溯到JSON解析器(显然与例如道场在旧版本)没有验证的JSON字符串作为有效的JSON语法。 所有JSON我知道分析器图书馆做验证的今天,但这个博客帖子从2008年表明,道场的说版本将允许JSON.parse正常的JSON,而eval只会失败,这将使你对方便保护JSON劫持。

  • while(1)可以使用进行无效Number原型,通过分配01的值。

  • for(;;)while(1)都有崩溃被劫持的网站,这不只要添加到保护任何脚本是有效的停止,而错误的每个进一步执行的影响。 因为根据定义错误并不标志着在javascript脚本执行结束这是很重要的,而for(;;)确保没有脚本凡从后执行。 这是为了防止(据我所知假设)的情况下,攻击者成功利用中的弱点,拦截脚本错误window.onerror ,覆盖eval ,或进行代理错误对象实例化(如覆盖constructorError.prototype )。

    UPDATE

    还有在security.stackexchange这个问题建议不要使用for(;;)while(1)因为它可以暗示你的网站是拒绝服务攻击的客户端CPU或触发恶意软件扫描。 我没有看到一个严重的拒绝服务问题与现代的浏览器,因为它们运行沙盒,并在每个选项卡基础。 但可以肯定的是旧版本浏览器的问题。 该恶意软件扫描程序是一个真正的问题,并且可以用作攻击报告您的网站。

  • &&&START&&& (和相应的&&&END&&&标签)使接收JSON比只使用容易在客户端解析)或可以被无意中封闭的评论,并且可以提高可读性&能见度为程序员。 包装的意见只是一个变化,因为它提供了/*开始和*/结束标记。 在我看来,在开始明显和清晰的标记和最终帮助注意到的克鲁夫特的意义。 使用注释是不是真的提供。



Answer 2:

关于“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":"*/"}因为这将创建一个语法错误,然后,甚至抛出的错误可能是可能是一个问题,如果是开捕,可能暴露在哪里的错误happend。或者如果错误对象本身可以改变行的一些信息。



文章来源: JSON unparseable cruft: Why so serious?