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 並不是出於惡意,而是為了讓他們的作品難以被竊取。如果用於此目的,混淆通常是沒有用的,但重點是混淆並不一定意味著惡意。