2012-02-05 101 views
7

我忙於嘗試理解c#中的安全性內容,並且很努力地看到Assert如何工作。我正在使用.net 3.5。在C中斷言權限#

我做了一個示例應用程序,試圖找出這一點。

調用方法:

[FileIOPermission(SecurityAction.Deny, ViewAndModify = @"C:\")] 
    static void Main(string[] args) 
    { 
     WriteTest testWriter = new WriteTest(); 
     testWriter.Test(); 
     Console.Read(); 
    } 

在一個單獨的類庫我有:

public class WriteTest 
{ 
    public void Test() 
    { 
     try 
     { 
      FileIOPermission permission = new FileIOPermission(FileIOPermissionAccess.Write, @"C:\"); 
      permission.Assert(); 
      using (StreamWriter sw = new StreamWriter(@"C:\test.txt")) 
      { 
       sw.WriteLine("testing!"); 
       sw.Flush(); 
      } 
      Console.WriteLine("Writen to file!"); 
     } 
     catch (SecurityException sec) 
     { 
      Console.WriteLine("No privileges!"); 
     } 
    } 
} 

此代碼執行罰款和所有。它會寫入文件。我的問題是這個工作到底如何?這是否不會使安全類無效,如果我可以斷言我想要的權限,以便它跳過檢查?如果我將Assert更改爲Demand,則會引發異常。

安全類的重點是不允許我設置權限,以便當我打電話給第三方課時,我可以防止它流氓並做我不想做的事情?我知道如果我在AppDomain中加載DLL,即使第三方DLL使用Assert,我也會得到這種效果,但如果我直接調用它,這似乎很奇怪。我試過閱讀關於Assert的MSDN文檔,但我發現很難理解。

+0

請確保您需要了解.NET 4以前的安全模型...自.NET 4.0代碼訪問安全性已被簡化。 – 2012-02-05 12:26:17

回答

3

Assert()更少 -Privileged代碼(「Assembly A」)調用更多 -privileged代碼(「Assembly B」)來執行某些任務時有用。要執行該任務,程序集B需要運行需要強大權限的代碼 - 程序集A可能沒有的權限。因此,大會B首先要求功能較弱的權限(首先執行任務的權限),然後聲明更強大的權限以實際執行任務。

例如,假設部分信任的Silverlight應用程序想要使用System.Net.WebRequest類發出HTTP請求。建立網絡連接需要SocketPermission,但這是一個強大的低級權限,不應授予來自Internet的不可信代碼。因此WebRequest要求功能較弱的權限WebPermission,然後在繼續建立網絡連接之前聲明SocketPermission。現在

,在具體的例子,因爲類庫是在相同的權限級別作爲應用程序,同時應用程序和類庫運行Assert()覆蓋Deny很可能運行的完全信任。組件總是可以在其授予集中有任何許可。要在類庫上執行Deny,您必須將類庫放入沙箱中。

注意:在.NET 4.0中,Deny已被棄用。從MSDN Library

運行時支持已爲強制執行的拒絕,RequestMinimum,RequestOptional和RequestRefuse權限請求刪除。一般而言,這些請求並不完全瞭解,並且在未正確使用時存在安全漏洞的可能性:

  • 拒絕操作可能很容易被Assert操作覆蓋。如果權限位於程序集的授予集中,程序集中的代碼就能夠執行Assert操作以獲得權限。 Assert阻止了Deny在堆棧中被看到,使其無效。
+0

謝謝!這有助於理解這一切 – 2012-02-05 17:41:23

1

Assert()方法會導致代碼訪問安全性(CAS)停止在特定的權限檢查請求上散步堆棧。

Assert是一種可以在代碼訪問權限 類和PermissionSet類上調用的方法。您可以使用斷言來啓用 您的代碼(和下游呼叫者)執行代碼爲 有權執行的操作,但呼叫者可能沒有權限執行操作。 安全聲明更改了安全檢查期間運行時 執行的正常過程。當您聲明權限時, 會通知安全系統不要檢查您的代碼的調用者 聲明的權限。

Using the Assert Method

我想你想Demand()

的意義:

+0

我明白它的作用,我只是爲什麼它這麼做而感到困惑。在我看來,Assert只是否定了調用者設置的權限,這種設置權限對我來說似乎毫無意義。如果我導入一些第三方DLL並將其設置爲沒有寫權限(就像我在這裏做的那樣),第三方DLL可以使用Assert並獲得寫權限? – 2012-02-05 10:15:34

+0

@DavidEsteves聲明只適用於在程序集級別已具有寫權限的DLL(例如,它們位於AppDomain的完全信任程序集列表中)。總之,這意味着「使用我的程序集級別權限覆蓋堆棧級權限」。 – Medinoc 2017-02-03 13:46:10

+0

我們有SecurityPermissionFlag.Assertion的枚舉(在SecurityPermission類中使用),可以在新的Appdomain的調用者中設置。它可以防止第三方組裝從斷言? – 2017-10-20 11:17:16