2014-03-04 58 views
2

有大量的javascript混淆網站在那裏做的伎倆,但我不知道當代碼與OOP創建時該怎麼做。混淆javascript這就是面向對象

順便說一句,我混淆了縮小尺寸和可讀性。我完全清楚它不會嚴肅地保護任何東西。

例如:

<script> 
    $(document).ready(function() { 
    myFunction.init(); // init 

    }); 

</script> 

file.js

var myFunction = function() { 

    return { 

     //main function to initiate the module 
     init: function() { 
      alert('whole bunch of other stuff in here'); 
     } 
    } 
} 

如果我模糊file.js的myFunction.init()項輸給了程序,因爲它被重命名爲某種變量。

此外,另外一個問題是,如果init中的某個函數是從不同的類或函數調用的,則由於變量名稱更改而仍然丟失。

任何想法?最佳實踐?

+4

你爲什麼不把它縮小呢? JS文件永遠不會「安全」 –

+0

你在使用什麼混淆器?我覺得好人不會那樣做。或者,您可能必須將其標記爲混淆器才能觸摸它 – Ian

+0

您的示例不起作用。我在我的大型項目中使用requirejs。它有一個基於uglify rotine的命令'r.js -o shim_file.json' http://requirejs.org – andlrc

回答

0

我剛剛編寫了自己的面向對象的Javascript代碼混淆器,我的結論是,要爲任何人使用編寫通用目標是非常困難的,這可能會解釋缺乏公共可用的工具。爲了讓我的工作,我必須確保我的業務代碼遵循一致的編碼實踐。如果你是認真的代碼混淆而不願寫「編譯器品質」混淆(我寫我的在Perl和從未使用過法),這是我的建議是:

  1. 逐漸混淆您的代碼,以便後每一步,代碼仍然有效。這裏的想法是,有很多事情可以重新命名,如果你一次全部重命名它們,如果你的混淆破壞了代碼,將很難排除故障。就我而言,第一步是識別對象名稱和成員函數名稱而不做任何模糊處理。我使用了一個配置文件,其中包含我想要混淆的所有文件的列表,還可以指定明確不應該被混淆的特定對象名稱和成員函數名稱。例如,如果您命名了一個函數push(),您可能不想混淆該函數名稱,因爲您的模糊處理器冒着搞亂數組對push()的調用的風險。作爲另一個例子,如果你的客戶端代碼按名稱實例化一個特定的對象,那麼你應該選擇不混淆該對象的名稱。 step1的輸出是所有標識的對象名稱,函數名稱和每個提議的混淆名稱的列表。
  2. 在我的版本中,第2步然後讀入一個配置文件中定義的所有文件,使用模糊映射並輸出單個Javascript文件。由於我們有3個相關的獨立項目,我們實際上有3個配置文件和3個輸出文件。原始的源代碼由數十個文件組成,所以這對我們來說非常不同。
  3. 我們混淆項目的下一個階段是使用類似於步驟1和2的過程來重命名成員變量。
  4. 最後一個階段是運行一個合法的minify程序,比如closure-compiler.jar。這會產生混淆所有局部變量和刪除不需要的空白的效果。

最終結果是一個幾乎不可理解的文件。我們使用一個腳本將所有內容一起批量處理,因此模糊處理是自動化和無痛的。我們還有一個替代腳本,可以將這些文件打包成相同的文件,但如果我們需要排除故障,則不會造成混淆。

下面是一些附加的建議: 1.確保每一個對象聲明以一個大寫字母,並聲明不以大寫字母開頭的每個全局函數。這將使區分對象和正常功能成爲可能。 2.使用一致的前綴爲每個成員變量命名。在我的情況下,我用字母「m」開頭,後跟大寫字母開頭的所有成員變量。例如,而不是this.name,請使用this.mName。如果你符合這種做法,你可以安全地使用一個非常簡單的腳本來重命名成員變量的使用。

對不起,我們沒有開源我們的面向對象的Javascript混淆器。我們沒有時間爲它提供任何支持,所以我們沒有公開發布它,但是我已經從組織角度給你提供了我們所做的本質,所以我希望它有幫助。

+0

這聽起來像很多工作和非常乏味。每當你對你的代碼做一些小改動時,你真的想要通過這個過程?混淆應該是一個自動化的過程。 –

+0

這是一個自動化過程。我們使用配置文件,並且可以在一個腳本中完全混淆所有內容,該腳本運行一系列步驟。我們在幾十個文件中有幾十個Javascript對象,但我們能夠將有凝聚力的代碼組混淆成單個文件 – Steven