在阅读this问题之后,为什么google / facebook等添加了无法解析的内容:
while(1);
for(;;);
&&&START&&& ... &&&END&&&
)
,使整个行无效,语法错误现在,似乎这种无限循环和(奇怪的)语法错误的附加保护将是绕过旧的和允许的javascript解析器,但我似乎找不到任何引用,表明情况就是如此。还有另一个SO question继续解除while(1);
解决方法(声明1可以被破坏)并拒绝另一种形式{}&&
的解决方法,但不解释原因或引用任何来源。
其他参考资料:
/*-secure-\n...*/
答案 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.prototype
或for(;;)
,因为可能暗示您的网站是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":"*/"}
的内容,因为这会产生语法错误。甚至抛出的错误可能是一个问题,如果它是可捕获的,可能会暴露一些关于错误发生的行的信息。或者错误对象本身可以被更改。