这来自对StackOverflow有关JavaScript变量的问题的评论:为什么◎ܫ◎和☺不是有效的JavaScript变量名?

JavaScript接受零宽度字符作为有效变量名,例如所有三个这些变量的名称不同,但在外观上是相同的:

var ab, /* ab */
    a‍b, /* a‍b */
    a‌b; /* a‌b */
这是上面三个变量的JSFiddle示例。

将其作为JavaScript(和其他支持语言)的混淆技术的优缺点?

#1 楼

好吧,在您自己的程序中,可能没问题。但是在公司环境中,这是一场维护噩梦,而没有极好的文档和/或团队连续性。在我的经验中,这似乎都不是很普遍的。

我认为一个更普遍的问题可能是,“混淆技术真的有用吗?”我可以了解minify用于页面加载的目的。但是隐藏源似乎没有任何意义。您要么以为您有一些以前从未做过的聪明算法。如果真是这样,也许JS并不是它的语言,因为实际上没有办法完全隐藏它。或者,您正试图变得三心二意,并通过模糊性尝试某种安全性,通常这是一个坏主意。

#2 楼

以下问题构成了一个大骗局:


遇到此类代码时,哪个JavaScript解释器会中断?
这可以接受吗?

A简单的普通混淆器应产生可接受的钝度代码,而不会破坏一些JavaScript解释器。

如果真的想使用变量名中的零宽度字符,它将包含在代码混淆过程中(生成的js文件应仅在浏览器版本检查后加载。)这样,开发人员不必在原始源代码中处理零宽度字符。

#3 楼

使用零宽度字符对变量名称进行混淆处理与重命名变量一样容易。在反混淆过程中,无论如何您都要这么做,因为您可以推断出变量背后的意图并为它们赋予有意义的名称。因此,该技术最多可能会提示读者进行初始重命名。额外的去混淆成本可以忽略不计。这是不值得的,abc没有优势,...

#4 楼

这也打破了一些美丽的人(但不是全部)。例如,通过JS Beautifier运行代码:

   var ab = "Hello, world!",
       a‍ b = "Completely different string!",
       a‌ b = "Yet another completely different string!";

document.getElementById('result1').innerHTML = ab;
document.getElementById('result2').innerHTML = a‍ b;
document.getElementById('result3').innerHTML = a‌ b;


(注意“ a”和“ b”之间的空格。)

您可能会争辩说这是一个利弊。根据您使代码产生的混乱程度,看随机注入的空间可能会更加混乱。另一方面,它也提醒读者肯定有问题。