目錄
JavaScript 是一種現代程式設計語言,可以創建龐大且動態的網站內容。有趣的是,它的工作原理是單線程。這意味著您一次只能執行一項作。物件可以直接製作,變數沒有固定的靜態類型。
JavaScript 對許多 Web 開發人員來說很容易,使用者和任何人都可以存取它的應用程式代碼。對於網站開發人員來說,這是使用JavaScript最具挑戰性的部分。通過這種方式,許多攻擊者可以輕鬆訪問和利用可能損害網站和業務的網站代碼和數據漏洞。
為了克服或保存 JavaScript 生成的代碼,開發人員採用了一種稱為 JavaScript 混淆的技術。在本文中,您將探討 JavaScript 混淆器、如何保護和保存 JS 代碼以及 JS 混淆器的重要性。
什麼是 JavaScript 混淆?
保護代碼的過程,開發人員將核心代碼更改或修改為人類無法輕鬆理解的問題形式,同時確保代碼的正確執行。與加密(需要金鑰來解碼修改後的代碼)不同,混淆不需要任何密鑰來重組核心代碼。
此過程的主要目的是防止或阻止未經授權的訪問、逆向工程和知識產權盜竊。
為什麼要使用 JavaScript 混淆?
混淆可以用於各種目的和好處,因此它的使用方式如下:
1-防盜安全
混淆可以保護您的代碼和敏感資訊免受網路竊賊和攻擊者的侵害,從而保護項目的隱私。
2-預防脾氣
混淆代碼會使駭客難以調試它們,以便它們可以用於惡意目的。
3-維護商業利益
混淆將通過保護一個人的戰術和戰略的獨特實施來確保競爭優勢。
4-保護敏感資訊
有些代碼包含對作很重要但不應向公眾公開的敏感資訊、金鑰或邏輯,防止您的資訊洩露並幫助資訊只為您服務。
以下是 JavaScript 混淆器的範例:
JS 中 Hello 一詞的核心代碼是這樣的:
函數 greet(name) {
返回“你好,”+姓名+“!”;
}
混淆作將以下代碼轉換為:
function _0x2c56(_0x1a73){return '你好,'+_0x1a73+'!';}
兩個代碼具有相同的含義,它們的輸出沒有差異,但拼寫錯誤的差異會導致代碼受到顯著保護。複雜的東西總是更難訪問。
JavaScript 混淆如何工作?
JS混淆的工作如下圖所示
整個過程遵循一些步驟,例如
1-變數重命名
在這裡,描述性變數名稱的替換是用無意義的字串完成的(例如,使用者名變為 a1b2c3)
下面給出一個例子,以便更好地理解
原代碼:
函數 calculateTotal(價格, 稅) {
退貨價格+(價格*稅);
}
混淆后,此代碼可能如下所示
混淆代碼:
函數 _0x45a1(x,y){返回 x+(x*y);}
2 字串和數位編碼
它也稱為字串加密。這是一個將敏感數據(例如 URL 或 API 金鑰)在代碼中使用字串編碼的過程。以下是字串加密的範例:
原代碼:
const apiKey = “ABC123”;
混淆版本如下。
混淆代碼:
常量 _0x3d2a = “\x41\x42\x43\x31\x32\x33”;
3-控制流壓平
簡稱為代碼扁平化。簡化了複雜的代碼結構,刪除了註釋以盡可能降低可讀性。
原代碼:
簡易代碼可以如下所示
函數 checkAccess(user) {
if (user.role === “admin”) 傳回 true;
否則返回 false;
}
混淆代碼:
函數 _0x1a2b(_0x3c4d) {
return _0x3c4d[“\x72\x6f\x6c\x65”] === “\x61\x64\x6d\x69\x6e” ? !0x0 : !0x1;
}
可讀性大大下降,從上面介紹的兩個代碼之間的差異中可以看出。
4-死代碼插入
它類似於代碼扁平化和控制流更改。它是在原始代碼中添加無意義的代碼片段,以降低其可讀性。
函數 validateInput(輸入) {
if (input.length > 5) 傳回 true;
否則返回 false;
- 下面的死代碼
常量 x = 10;
console.log(“這永遠不會運行”);
}
此代碼的死代碼插入版本(混淆)如下 所示:
函數 validateInput(輸入) {
if (input.length > 5) {
- 死代碼,沒有任何用處
const unusedVar = Math.random() * 100;
console.log(“這是死代碼的一部分:”, unusedVar);
返回 true;
} 否則 {
- 下面有更多死代碼
let fakeCondition = input.includes(“秘密”);
如果 (假條件) {
console.log(“這個條件是假的,無關緊要的”);
}
返回 false;
}
- 無法存取的死代碼
常量 x = 10;
常量 y = 20;
console.log(“這永遠不會執行,但會讓攻擊者感到困惑:”, x + y);
}
5.反調試技術
JS 中的反調試技術是獨一無二的,涉及調試器語句、控制台檢測和定時攻擊來阻礙代碼和調試。
setInterval(函數(){
if (typeof console._commandLineAPI !== 'undefined') {
alert(“檢測到調試器!”);
window.location.href = “關於:空白”;
}
},1000);
當使用 JS 混淆工具修改為混淆版本時,相同的代碼。通過使用額外的反調試層來理解和分析它變得更加困難。
混淆代碼:
(函數 () {
var _0x3c87 = ['_commandLineAPI', 'undefined', 'about:blank'];
(函數 (_0x4d1b99, _0x1ea782) {
var _0x223b1b = 函數 (_0x234219) {
而 (--_0x234219) {
_0x4d1b99['push'](_0x4d1b99['shift']());
}
};
_0x223b1b(++_0x1ea782);
}(_0x3c87, 0x18f));
var _0x4a68 = function (_0x4d1b99, _0x1ea782) {
_0x4d1b99 = _0x4d1b99 - 0x0;
變數 _0x223b1b = _0x3c87[_0x4d1b99];
返回_0x223b1b;
};
setInterval(函數 () {
if (typeof console[_0x4a68('0x0')] !== _0x4a68('0x1')) {
alert(『檢測到調試器!』);
視窗['位置']['href'] = _0x4a68('0x2');
}
},0x3e8);
})();
這些只是一些簡單的步驟(技術),說明如何將一段簡單而重要的代碼轉換為最高難度級別,使其看起來像是使用混淆工具的非常高級和複雜的代碼。
JavaScript 中混淆的實踐建議
對於 JS 中混淆的最佳實踐,有幾個建議可以將其付諸實踐。
選擇可靠的工具
作受信任的混淆器(如 JavaScript Obfuscator 或 UglifyJS)以刪除健壯的轉換。
2-與其他安全措施的混淆
混淆是啟動防禦層。將其與嚴格測試、安全編碼實踐等不同技術相結合,可以為您的專案添加牢不可破的保護。
3-代碼文件
保存原始代碼和章程的清晰版本以備將來調試。它將允許您存取原始代碼,從而使修改過程更容易。
4-活躍度
隨時瞭解新出現的威脅並相應地修改您的混淆策略。
道德考慮
混淆的想法提出了一種道德保護專案免受網路攻擊的感覺。因此,濫用它會導致不良情況,例如:
1-部署惡意軟體
網路犯罪分子經常使用混淆技術來隱藏他們的危險腳本或犯罪記錄。
2-欺騙性做法
混淆還可以侵犯一個人的隱私、跟蹤腳本等。考慮正確使用此類技術始終至關重要。在這些事情之間保持平衡是執行混淆的第一步。
混淆 的局限性
雖然使用混淆來保護您的代碼和專案非常有益,但它並非萬無一失。它有一些限制,可能會在使用它時激怒您。下面討論其一些未滿足的差距:
1-性能影響:
如果您的代碼被混淆得超出需要,它將對代碼的運行時產生負面影響,主要是在使用動態生成或冗餘代碼方法的情況下。
2-缺乏絕對安全感:
專家駭客或攻擊者可以對已經混淆的代碼進行混淆,最終無法保護您的代碼。
3-調試挑戰:
混淆的代碼總是很難調試、維護或開發,因為添加了用於保護其的不必要的行。對於不屬於原始代碼和混淆代碼開發團隊的程式師來說,這更加困難。
4-兼容性問題:
並非所有瀏覽器或環境都可以訪問特定的混淆技術,因此增加了代碼輸出或工作中出現技術問題的可能性。
結論
JavaScript 混淆是一種強大而有益的工具,可以保護代碼免受盜竊、駭客、攻擊者、篡改和逆向工程的侵害。雖然它是通過編碼保存在計算機中的敏感資訊和智慧財產權的保護盾,但它並不是永久或無敵的安全解決方案。
開發人員不能僅僅依賴混淆。通過瞭解並充分瞭解其技術、優點和局限性,開發人員可以使其更有價值和更有效,從而最終保護您的代碼。
雖然它有一些好處、局限性以及流程或技術存在所需的一切,但它的真正力量在於它是分層防禦策略的一部分;您需要進行足夠的練習,以使其比其他任何人都更有效、更有説明和更有成效。它有助於確保 JavaScript 代碼在不斷發展的數位環境中的完整性、機密性和可靠性。
簡而言之,它是一種説明您維護隱私並激勵您思考更有效的方法來保護您的資訊的工具。
有關優化 Web 開發的更多工具,請查看:
有關更多安全工具,請訪問UrwaTools安全部分。