[英]Assert Permissions in C#
我正忙着嘗試理解c#中的安全性,我正在努力去了解Assert的工作原理。 我正在使用.net 3.5。
我做了一個示例應用程序試圖解決這個問題。
通話方式:
[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文檔,但我發現很難理解。
當較少特權代碼(“程序集A”)調用更多特權代碼(“程序集B”)來執行某些任務時, Assert()
非常有用。 要執行該任務,程序集B需要運行需要強大權限的代碼 - 程序集A可能沒有的權限。 因此,程序集B首先需要一個不太強大的權限(首先執行任務的權限)然后斷言實際執行任務的更強大的權限。
例如,假設部分信任的Silverlight應用程序想要使用System.Net.WebRequest
類發出HTTP請求。 建立網絡連接需要SocketPermission
,但這是一個強大的低級別權限,不應授予來自Internet的不受信任的代碼。 因此, WebRequest
需要一個不太強大的權限WebPermission
,然后在繼續建立網絡連接之前斷言SocketPermission
。
現在,在您的特定示例中, Assert()
會覆蓋Deny
因為類庫在與應用程序相同的權限級別運行 - 應用程序和類庫都可能作為完全信任運行。 程序集始終可以在其授權集中Assert()
任何權限。 要在類庫上強制執行Deny
,您必須將類庫放在沙箱中。
注意:在.NET 4.0中, Deny
已被棄用。 來自MSDN Library :
已刪除運行時支持以強制執行Deny,RequestMinimum,RequestOptional和RequestRefuse權限請求。 通常,這些請求未被充分理解,並且在未正確使用時可能存在安全漏洞:
- 可以通過Assert操作輕松覆蓋拒絕操作。 如果權限位於程序集的授權集中,則程序集中的代碼能夠執行權限的Assert操作。 Assert阻止了Deny在堆棧中被看到,使其無效。
Assert()
方法導致代碼訪問安全性(CAS)停止在特定權限檢查請求上執行堆棧。
Assert是一種可以在代碼訪問權限類和PermissionSet類上調用的方法。 您可以使用Assert來啟用代碼(和下游調用方)來執行代碼有權執行的操作,但其調用方可能沒有權限執行操作。 安全性斷言會更改運行時在安全檢查期間執行的正常過程。 當您聲明權限時,它會告訴安全系統不要檢查代碼的調用者以獲取聲明的權限。
我想你想要Demand()
出於興趣:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.