JavaScript 是在用戶端的電腦執行,但是有些情況下,我們不希望使用者抄襲我們精心製作出來的程式碼,因此就有必要對 JavaScript 程式碼進行簡單的保護或加密。
首先,我們可以使用 escape() 和 unescape() 來對 JavaScript 程式碼來進行簡單的加密與解密,請看下列「每日一句」的範例:
在此範例中,只要重載一次,就會以亂數挑選一句格言。若是選擇檢視原始檔,則只會看到一堆亂碼,如下:
但是上述亂碼是由原先工整的程式經由 escape() 編碼的結果,然後經由 unescape() 來得回原先的字串,再由 eval() 來執行之,整個流程可以說明如下:
- 先撰寫未加密的原始網頁。(本例為 randomText.htm)
- 利用 escapeEncodeTest01.htm 來進行 escape() 的編碼。
- 將編碼後的字串拷貝到加密後的網頁,但必須經由 unescape() 來轉回原來的程式字串,再經由 eval() 來執行之。然後就大功告成了。
在上述說明中,我們使用了一個好用的網頁來對 JavaScript 程式碼進行 escape() 編碼:
上述範例的原始檔如下:
在上一個範例中,經由 escape() 編碼後,你還是可以由編碼後的字串看到諸如「function」、「square」等有意義的字眼,因此比較容易猜到程式碼的內容。另一種方法,則是先將程式碼進行「平移編碼」(Shift Encoding),再進行 escape 編碼,這時候就看不到有意義的字眼了。範例如下:
上述範例仍是「每日一句」,若檢視原始碼,則只會看到一堆亂碼,完全沒有有意義的字眼在裡面,如下:
產生上述程式碼的流程可以說明如下:
- 先撰寫未加密的原始網頁。(本例為 randomText.htm)
- 利用 shiftEncodeTest01.htm 來進行 shiftEncode() 及 escape() 的編碼。
- 將編碼後的字串拷貝到加密後的網頁,但必須經由 unescape() 及 shiftEncode() 來轉回原來的程式字串,再經由 eval() 來執行之。然後就大功告成了。
在上述說明中,我們使用了一個好用的網頁來對 JavaScript 程式碼進行 shiftEncode() 及 escape() 編碼:
上述範例的原始檔如下:
在上一個範例中,經由 shiftEncode() 及 escape() 編碼後,你還是可以由編碼後的字串看到諸如「gvodujpo」等平移過後的 ASCII 字元,若要完全避開這些字元,可將將程式碼進行「XOR編碼」(XOR Encoding),再進行 escape 編碼,範例如下:
上述範例仍是「每日一句」,原始碼更加凌亂,如下:
產生上述程式碼的流程可以說明如下:
- 先撰寫未加密的原始網頁。(本例為 randomText.htm)
- 利用 xorEncodeTest01.htm 來進行 xorEncode() 及 escape() 的編碼。
- 將編碼後的字串拷貝到加密後的網頁,但必須經由 unescape() 及 xorEncode() 來轉回原來的程式字串,再經由 eval() 來執行之。然後就大功告成了。
在上述說明中,我們使用了一個好用的網頁來對 JavaScript 程式碼進行 xorEncode() 及 escape() 編碼:
上述範例的原始檔如下:
而 shiftEncode() 及 xorEncode() 則定義於 encode.js,如下:
有關於本節所介紹的編碼與解碼的方法,可以列表如下:
相關函數 | 編碼方式 | 解碼方式
|
---|
escape() 和 unescape() | escape(原字串) | unscape(編碼後字串)
|
shiftEncode() | shiftEncode(原字串, 平移量) | shiftEncode(編碼後字串, -平移量)
|
xorEncode() | xorEncode(原字串, XOR字串) | xorEncode(編碼後字串, XOR字串)
|
當然嘍,同學們還可以想出更複雜的編碼與解碼函式,來保護你的程式碼。但是這些保護方式,還是只防君子,不防小人,因為對於功力高深的有心人來說,還是可以抽絲剝繭地慢慢破解你的編碼過程。
JavaScript 程式設計與應用:用於網頁用戶端