C# 安全性教程

iDotNetSpace發表於2009-07-09
大多數應用程式和元件開發人員不需完成任何特別的工作就可使用 .NET Framework 安全系統並從它所提供的安全保護中受益。
但“安全庫”是一個例外,它要求瞭解更多深入的知識並對安全系統加以特殊考慮。這些程式碼表明瞭安全託管程式碼與非限制程式碼之間的界限,後者如本機程式碼(這超出了 .NET Framework 安全基礎結構可以強制的範圍)。這些庫通常必須受到高度信任才可以工作,它們是託管程式碼中程式設計錯誤會潛在地暴露安全隱患的一個位置。程式碼訪問安全性無法消除人為錯誤的可能性,但相對於使用幾個安全庫的大量應用程式程式碼而言,需要嚴格審查的程式碼量將大大減少。
示例
該教程包括下列示例: 
示例 1:強制式安全性 
示例 2:宣告式安全性 
示例 3:禁止安全性 
安全性
.NET Framework 安全性通過在託管程式碼上強制實施安全限制來防止其他程式碼誤用或破壞您的程式碼和資料。當 .NET Framework 應用程式請求許可權時,由管理員建立的安全策略將授予許可權或拒絕執行程式碼。信任是基於有關程式碼的證據(如數字簽名、程式碼來自何處等)的。一旦授予許可權,安全性就會實施控制這些程式碼可以做什麼(或如果未授予許可權,則控制程式碼不能做什麼)的許可權。
許可權
.NET Framework 安全性只有當程式碼具有使用受保護資源的“許可權”時才允許它使用這些資源。為了表示此情形,.NET Framework 使用了“許可權”的概念,它表示程式碼訪問受保護資源的權力。程式碼請求所需的許可權,然後由 .NET Framework 應用的安全策略確定實際授予程式碼哪些許可權。
.NET Framework 提供了程式碼訪問許可權類,其中每個類都封裝了訪問某一特定資源的能力。使用這些許可權向 .NET Framework 指示需要允許程式碼做什麼以及必須授權程式碼的呼叫方做什麼。策略還使用這些物件確定要向程式碼授予哪些許可權。
策略
安全策略的強制性保證了 .NET Framework 託管程式碼的安全。每個載入的程式集都受到安全策略的約束,安全策略基於信任授予程式碼許可權,而信任又是基於有關程式碼的證據的。有關管理安全策略的資訊,請參見“閱讀材料列表”中的 .NET Framework 文件。
在 C# 中請求安全許可權
在 C# 中請求安全許可權的方法有以下兩種: 
強制式:使用對 .NET Framework 中許可權類的呼叫 
宣告式:使用安全許可權屬性 
下面兩個示例說明了這兩種方法。有關請求安全許可權的更多資訊,請參見要求。
示例 1:強制式安全性
以下示例使用 .NET Framework 呼叫拒絕 UnmanagedCode 許可權。
// ImperativeSecurity.cs
C# 安全性教程Code
輸出
Attempting to call unmanaged code without permission.
Caught Security Exception attempting to call unmanaged code.
Attempting to call unmanaged code with permission.
Hello World!
Called unmanaged code with permission.
示例 2:宣告式安全性
這是使用安全許可權屬性的同一個示例。
// DeclarativeSecurity.cs
C# 安全性教程Code
輸出
Attempting to call unmanaged code without permission.
Caught Security Exception attempting to call unmanaged code.
Attempting to call unmanaged code with permission.
Hello World!
Called unmanaged code with permission.安全性和效能 
.NET Framework 安全系統可以防止從網路上下載的惡意程式碼損壞您的計算機系統。但即使程式碼從不引發 SecurityException,這些安全檢查也並不是沒有代價的。 

通常,公共語言執行庫驗證非託管方法的呼叫方在執行時是否對每個非託管方法呼叫都具有非託管程式碼訪問許可權。這對多次呼叫非託管程式碼的應用程式來說代價可能是非常高的。SuppressUnmanagedCodeSecurityAttribute 可以更改此預設行為。當用該屬性宣告非託管方法時,將在呼叫該方法的程式碼被載入到公共語言執行庫中時檢查安全請求。 

安全說明   使用 SuppressUnmanagedCodeSecurityAttribute 時,應格外小心以確保沒有引入安全漏洞。例如,開發人員需要驗證使用者正在安全使用非託管 API 以及呼叫方無法影響或濫用此呼叫。開發人員還可以新增適當的請求以確保所有呼叫方都具有適當的許可權。例如,如果對本機程式碼進行呼叫以訪問檔案(目的是利用結構化儲存,如擴充套件檔案屬性等),而非託管程式碼請求被禁止,則應明確發出一個檔案 IO 請求以確保程式碼不會被誤用。 
示例 3:優化非託管呼叫 
在本例中,對非託管程式碼許可權的檢查僅在載入時執行一次,而不是在每次呼叫非託管方法時都執行。如果多次呼叫非託管方法,則可能極大地提高效能。 

// SuppressSecurity.cs 
C# 安全性教程Code
輸出 
Attempting to call unmanaged code without UnmanagedCode permission. 
Hello World! 
Called unmanaged code without UnmanagedCode permission. 
Attempting to call unmanaged code with permission. 
Hello World! 
Called unmanaged code with permission. 
程式碼討論 
請注意,以上示例允許兩個非託管呼叫都成功,即使第一個呼叫不具有 UnmanagedCode 許可權。在使用 SuppressUnmanagedCodeSecurityAttribute 時,應使用其他安全檢查以確保不會招致安全漏洞。在上面的示例中,通過在非託管呼叫之前新增 UIPermission 的 Demand: 

uiPermission.Demand(); 
做到這一點,它確保呼叫方具有顯示 UI 的許可權。  

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-608728/,如需轉載,請註明出處,否則將追究法律責任。

相關文章