分類
Javascript

模糊化你的javascript – Javascript Obfuscator

寫程式的過程中, 若不希望自己的程式碼給別人看, 最好的方法就是只提供編譯好的binary code, 而不提供原始碼(source code). 但 javascript 這種要給client side browser看的程式碼, 似乎沒有辦法將原始碼不提供出去. 但如此一來便會有程式碼外露的問題.

模糊化javascript並非是近期的技術, 早在沒有browser時, 單純的script也都希望被保護或難一眼望穿, 於是將程式碼加密或是混亂化(模糊化)就是這篇文章要探討的主題了.

隨著要讓 web 應用程式有更好的使用者經驗, RIA(Rich Internet Application)會是新一代web應用程式的主流應用技術, 無論是ajax或是單純的javascript, 都會隨著這類應用而使程式碼愈來愈多功能外露至client(再強調一下, 無論在client side做多少檢查, 在server side都要再做一次檢查, 以避免有安全性漏洞, server side的程式是最後把關的地方-當然, db端也能做不少防範事項), 於是無論是就安全性考量, 就程式碼保全考量, (還有另一個考量就是將程式碼壓縮以增進效能), 都應該要將 javascript 做某種程度的模糊化, 由於在模糊化的過程中, 通常會伴隨著體積縮小的效應, 所以 obfuscate 及 shrink 的作用是同時發生的. 基於這樣的好處, 適當地將 javascript 做模糊化是很有幫助的.

舉例來說, 在這篇文章(xmlRequest更換網頁內容)裡的 web request code 經過模糊化處理後, 得到下面的程式碼

function httpget(f,method,d){var g=false;try{g=new ActiveXObject("Msxml2.XMLHTTP");}catch(e){try{g=new ActiveXObject("Microsoft.XMLHTTP");}catch(E){g=false;}}if(!g&&typeof XMLHttpRequest!='undefined'){try{g=new XMLHttpRequest();}catch(e){g=false;}}if(!g&&window.c){try{g=window.c();} catch(e){g=false;}}method=method.toUpperCase(); if(method!="POST"&&method!="GET")return "";g.open(method,f,false); if(method=="POST") g.setRequestHeader('Content-Type','application/x-www-form-urlencoded'); g.send(d);return g.responseText;}

不僅模糊化了, 也連帶瘦身下來了, 上面的內容因文章排版關係, 還多加了一些斷行用的空白, 事實上是可不需要這些空白的. (上面的模糊化是利用 http://www.jasob.com/ 這個網站評估版的軟體試做的, 該網站也有一些範例可供參考)

事實上, html 也可以做某種程度的模糊化, 但要注意, 模糊化是要讓別人不容易看懂, 可不是要找自己麻煩, 千萬不要沒有備份自己的檔案, 因為要從模糊化後的程式碼來看程式或是反推回原來的程式, 可是非常累人的哦! 要做好原始檔的保存, 以免日後維護造成困擾就不好囉.

參考資料:

Speed


http://big5.pconline.com.cn/b5/www.pconline.com.cn/pcedu/empolder/wz/javascript/0602/762491.html
http://www.oreilly.com.tw/column_editor.php?id=e196
http://www.microsoft.com/taiwan/msdn/secmod/html/secmod94.mspx
http://fredwang.blogspot.com/2005_01_01_fredwang_archive.html

[2006/8/24 01:58]
線上將 javascript 壓縮:
http://javascriptcompressor.com/

[2007/9/7 0:26]
Notes on JavaScript Compression:
http://dean.edwards.name/weblog/2007/08/js-compression/

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *