2017-04-19 38 views
1

我理解公有和私有對可訪問性和一般編程慣例的區別。我在DLL中更具體地詢問這個問題的安全性。公有類的私有屬性是否安全在DLL中

的DLL看起來像這樣...

public static class OrphanAnnieDecoderRing 
    { 
     private const string _secretCode = "Drink More Ovaltine"; 

     private int OvaltineDrinkCount = 0; 

     public void DrinkOvaltine() => OvaltineDrinkCount += 1; 

     public string RevealSecret 
     { 
      get 
      { 
       if (OvaltineDrinkCount >= 500) 
       { 
        return _secretCode; 
       } 
       else 
       { 
        return "Unable to reveal secret!"; 
       } 
      } 
     } 
    } 

是我_secretCode和OvaltineDrinkCount性質從知名度或操縱安全被任何人訪問該DLL(從條件津貼一邊,一旦他們遇到了一定的標準)?我知道DLL文件可能會導致一些安全問題,我不確定是否需要注意私有屬性或私有常量。

+0

等待,你必須喝更多的奧瓦丁才能揭示這個祕密,那就是多喝奧瓦丁。這是一個金字塔方案 – Jonesopolis

+0

不,這是一個聖誕故事:P –

回答

2

編號

訪問修飾符用於限制成員訪問您的類的調用者。 這對於強制封裝是有用的,這是使用面向對象編程OOP(隱藏實現細節等)引入的主要目標之一。

當您將代碼編譯爲DLL時,它會在程序集中轉換爲中間語言(IL)(與傳統的非託管(Win32動態鏈接庫)技術上沒有多大關係,在運行時將其編譯爲機器代碼在目標機器上(通過即時編譯器JIT)

然而,IL可以很容易地使用像ILSpy這樣的工具進行「反向工程」,所以每個有權訪問你的程序集的人都可以「讀」祕密

(更進一步,甚至私人只讀字段可以使用反射從課堂外進行修改,但這是它自己的一個話題)

+0

除了這個優秀的答案,const字段值被存儲在程序集清單中,所以你甚至不必完全反編譯程序集。 – KeithS

+0

@earloc感謝您的簡潔和完整的答案!有沒有什麼方法可以幫我隱藏代碼中的祕密?或者這是否會需要另外混淆? –

+0

取決於祕密的種類..你想隱藏我們什麼? ;)也許我們可以推動你在正確的方向,如果實際問題有點精確。 無論如何,只要這個「祕密」存儲在一個程序集中,你所能做的就是提高惡意/欺詐性嘗試濫用該祕密(例如密碼學或混淆)的標準。無論哪種方式,它(僅)減少了風險 - 同時也減少了代碼的可讀性。 –

相關問題