26

在阅读了这个关于为什么 google/facebook 等的问题后,添加了无法解析的内容,例如:

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

对于他们的 JSON 响应,我理解了他们的动机。但是我仍然不清楚为什么要使用这种相对复杂的机制,当类似的效果可以通过类似的东西来实现时

  • )在开头添加额外内容以使整行无效并出现语法错误
  • 在评论中包装 JSON

现在,似乎这种对无限循环和(奇怪的)语法错误的额外保护将绕过旧的和宽松的 javascript 解析器,但我似乎找不到任何表明这种情况的参考资料。还有另一个SO question甚至继续讨论while(1);解决方法(说明 1 可以被破坏)并拒绝表单的另一种解决方法{}&&,但没有解释原因或引用任何来源。

其他参考:

4

2 回答 2

10

我认为有几个细节与不可解析的杂物的形式有关:

  • {}&&前缀可以追溯到JSON解析器(显然,例如旧版本中的 Dojo)没有将JSON字符串验证为有效的JSON语法。JSON我所知道的所有Parser 库现在都在进行验证,但是 2008 年的这篇博客文章表明,上述版本的 dojo 将JSON.parse正常允许 json,而eval只会失败,这将为您提供方便的防止JSON劫持保护。

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

  • for(;;)并且while(1)两者都具有使被劫持站点崩溃的效果,这确实增加了保护,因为任何脚本的每次进一步执行都会有效地停止而不会出现错误。这很重要,因为定义上的错误并不标志着 javascript 中脚本执行的结束,而 afor(;;)确保在它之后没有执行任何脚本。这是为了防止(afaik 假设的)攻击者通过利用window.onerror、覆盖eval或代理错误对象实例化(如覆盖constructorof Error.prototype)中的弱点成功拦截脚本错误的情况。

    更新

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

  • &&&START&&&(和相应的&&&END&&&标签)使接收 json 的客户端解析比仅仅使用)或可能无意关闭的注释更容易,并且可以提高程序员的可读性和可见性。包含注释只是其中的一种变体,因为它提供了/*开始和*/结束标记。在我看来,开头和结尾的清晰标记有助于注意杂物的含义。使用评论并没有真正提供。

于 2013-02-13T18:14:18.727 回答
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":"*/"}因为这会产生语法错误。甚至抛出错误可能可能是一个问题,如果它是可捕获的并且可能会暴露有关错误发生的行的一些信息。或者如果错误对象本身可以更改。

于 2013-02-06T07:11:45.290 回答