AVG 最近告诉我,一个网页被屏蔽了,原因是JavaScript 混淆。
网页为何被屏蔽?这到底意味着什么?
答案1
混淆是一种“模糊化”JavaScript代码真实含义和意图的手段。一些网站利用它作为阻止那些想要复制/借用其代码的人的障碍。其他网站则利用它作为隐藏代码实际意图的手段。
一些遮蔽形式:
- 自动将变量重命名为简短而无意义的名称,使代码的可读性降低且更难理解。
- 删除所有多余的空格和换行符,以便代码成为一行很长的长行。
- 使代码的各个部分自行生成,以便代码的第一次运行可以创建实际的代码,然后运行该实际的代码来执行预期的操作。
- 使用字符代码和字符串操作结合 eval 而不是普通的 javascript 代码来构建实际运行的代码。
模糊本身并不邪恶,但它可以用来隐藏邪恶的意图,这可能就是 AVG 所反对的。它检测到了太多的模糊,以至于无法判断 javascript 是否试图执行它试图阻止的操作。因此,它默认将代码声明为不安全,因为它无法验证代码是否正常。
答案2
混淆是指隐藏某些事物的本来含义。
在这种情况下,一个清晰可读的 JavaScript 代码片段,例如
window.onload = function() { alert("Hello " + username) };
可以替代
var _0xc5b2=["\x6F\x6E\x6C\x6F\x61\x64",
"\x48\x65\x6C\x6C\x6F\x20"];window[_0xc5b2[0]]=
function (){alert(_0xc5b2[1]+username);} ;
甚至
eval(unescape("var%20_0xc5b2%3D%5B%22onload%22%2C%22Hello%20%22%5D%3Bwindow"+
"%5B_0xc5b2%5B0%5D%5D%3Dfunction%20%28%29%7Balert%28_0xc5b2%5B1%5D+username"+
"%29%3B%7D%20%3B"));
所有三个代码片段都执行完全相同的操作,但只需阅读第一个就可以让您轻松理解其意图。
显然,AVG 会在允许执行 JavaScript 代码之前尝试了解其目的。当代码被混淆时,AVG 可能会失败。因此发出了警告。
话虽如此,一些网站混淆 JavaScript 并非出于恶意,而是为了难以窃取他们的成果。如果出于这种目的使用混淆,通常毫无用处,但关键是混淆并不一定意味着恶意。