JavaScript奇技淫巧:Eval的未公開(kāi)用法
JavaScript奇技淫巧:Eval的未公開(kāi)用法
作者:JShaman.com w2sft,轉(zhuǎn)載請(qǐng)保留此信息
很多人都知道,Eval是用來(lái)執(zhí)行JS代碼的,可以執(zhí)行運(yùn)算、可以輸出結(jié)果。
但它還有一種未公開(kāi)的用途,想必很少有人用過(guò)。
例:
var a = eval(['g', 'o', 'l', '.', 'e', 'l', 'o', 's', 'n', 'o', 'c'].reverse().join(""));
var b = ['m', 'o', 'c', '.', 'n', 'a', 'm', 'a', 'h', 's', 'j'].reverse().join("");
a(b);
這段JS代碼,如果單看語(yǔ)法,是否能知道a(b)調(diào)用會(huì)輸出什么?答案是很難想到的,它的輸出如下:

能有這樣的輸出,依靠的便是eval的未公開(kāi)用法:可以將字符串轉(zhuǎn)為語(yǔ)法關(guān)鍵字。
上面的eval語(yǔ)句,簡(jiǎn)化后等于:
eval("console.log")

用reverse、join是為了隱藏console.log明文。
這個(gè)方法用于JS代碼加密,效果很不錯(cuò)。
因?yàn)閷?duì)JS代碼混淆加密時(shí),語(yǔ)法關(guān)鍵字是很難隱藏的,就如console.log,一般情況下可能變化為:console[“l(fā)og”],或者console[“\x6c\x6f\x67”],log字符可以變化,但console作為語(yǔ)法關(guān)鍵字,是不可變的,這就容易被識(shí)別。
而eval的這種未公開(kāi)用法,恰好可以解決這一問(wèn)題??梢噪[藏很多語(yǔ)法關(guān)鍵字。