2013-12-14 71 views
0

我有一些C#代碼。它有一些配置設置存儲爲自動屬性或專用字段。理論上,使用它的人可以通過Reflection來修改私有變量。隱藏在.Net中的閉包變量

有沒有辦法否定它?我可以使用只讀靜態字段,然後它們不能被修改。但是對這個類本身的引用仍然可以用另一個惡意設置替換。

我想過關閉匿名方法和變量。但在這種情況下,該代表的鏈接仍可以替換。

另外我試過爲我的字段指定SecurityCriticalAttribute,因爲調用者可能沒有FullTrust訪問權限,但似乎沒有驗證字段的訪問權限。只是方法\類itselfs

UPDATE

我固定它以這樣的方式:

  • 初始化所有通過構造變量
  • 所有變量具有隻讀的定義
  • 我已經將CAS屬性添加到構造函數中,所以沒有FullTrust的人不能修改它

    [PermissionSetAttribute(SecurityAction.Demand, Unrestricted = true)] 
    

所以要更新變量,用戶需要創建該類的新實例。然後CAS驗證將驗證呼叫者。

我不喜歡這種方法太多了,如果你有更好的辦法,我會很感激

+2

您不能:http://stackoverflow.com/a/8357546/857807 – dcastro

+0

是的,同意。但我的調用者將使用沙箱appdomain。而該appdomain只會擁有反射權限。似乎構造函數的[PermissionSet]現在對我來說工作正常。也許是的,沒有限制的AppDomain,我不能否認它。 –

回答

2

不幸的是,在你的領域readonly修飾不會阻止通過反射施工後修飾。沒有辦法阻止具有私有反射權限的代碼修改內存中的應用程序狀態。實際上,ReflectionPermission被認爲是「危險」權限之一,對此,權限實質上類似於完全信任授權(http://msdn.microsoft.com/en-us/library/wybyf7a0.aspx)。

換句話說,你還不如不打擾沙盒在所有如果你打算在沙盤授予私人反射權限...

+0

好吧,看起來你是對的。我認爲如果field是隻讀的,那麼CLR不允許改變它,因爲編譯器會拒絕它。但似乎我錯了。這裏沒有幸福:( –