功能簡介
JavaScript 混淆器會改寫指令碼,讓它執行起來完全相同,但人很難閱讀和照抄。變數和函式名稱會變成 _0x3f2a 這種無意義的識別字,字串常值會移到經過編碼的查找表中;強度較高時,控制流程還會被打亂並混入無用程式碼。
它適用於以純 JavaScript 發布、又不希望被一字不改地複製的瀏覽器遊戲、示範、小工具和授權檢查。
使用方法
- 貼上你的 JavaScript,或開啟一個
.js檔案。 - 選擇 混淆強度:
- 低:重新命名區域名稱,並把字串移到查找陣列中。輸出仍然快速且相當精簡。
- 中:加入字串編碼、控制流程扁平化和一些無用程式碼。
- 高:所有手段全力套用。結果可能大上好幾倍,執行也明顯變慢。
- 只有在指令碼外部沒有任何地方參照其頂層函式或變數時,才開啟 重新命名全域名稱。
- 如果希望結果分成多行,請關閉 輸出為單行。
- 複製或下載混淆後的程式碼,部署前先測試。
範例
範例定義了一個 greet 函式和一個造訪計數器。以低強度混淆後,程式碼變成一行十六進位名稱,但執行後仍會印出 Hello, Ada! You have visited 1 time(s).
混淆與壓縮的差別
壓縮(例如 JavaScript 與 CSS 壓縮工具所做的)會移除空白並縮短名稱,讓檔案更小、下載更快。混淆在大小上則正好相反:它刻意加入間接層,讓程式碼更難理解。許多專案會壓縮所有檔案,只對少數含有值得保護之邏輯的檔案做混淆。
限制
混淆無法保護機密。瀏覽器能執行的東西,使用者最終都能檢視,所以 API 金鑰和必須保密的商業規則請留在伺服器上。高強度設定也會拖慢程式碼,請避免用在頻繁執行的迴圈和對效能敏感的頁面中。
常見問題
› 混淆會改變程式碼的行為嗎?
不會。混淆後的指令碼行為與原本相同,只有形式改變。請務必用混淆後的建置版本執行測試,因為會檢查自身原始碼或函式名稱的程式碼可能會表現不同。
› 混淆後的程式碼可以還原嗎?
無法完全還原,但有決心又有時間的人仍然能弄清楚它在做什麼。請把混淆當作阻擋隨手複製的減速丘,絕不要拿它來隱藏 API 金鑰之類的機密。
› 什麼時候該開啟「重新命名全域名稱」?
只有在指令碼完全獨立時才開啟。重新命名全域名稱後,HTML 屬性、其他指令碼或測試中以名稱呼叫你頂層函式的地方都會壞掉。
› 我的程式碼會被上傳嗎?
不會。混淆是在你的瀏覽器中,以開源的 javascript-obfuscator 函式庫執行。