顯示具有 DotNetFramework-應用程式安全性 標籤的文章。 顯示所有文章
顯示具有 DotNetFramework-應用程式安全性 標籤的文章。 顯示所有文章

2012年3月14日 星期三

程式碼安全性

在Windows作業系統中,一般我們比較常用的安全系統是以使用者或角色為主的安全性機制(role-base security, RBS), 透過對使用者或角色的管理,達到權限控管的目的,這也是大家比較熟悉的權限管理機制。

如果當我們使用一個外來的組件來存取磁碟,為了確保它內部無法執行任何的惡意行為,你希望限定這個組件只能存取特定目錄,像這樣子的狀況,就無法使用 RBS 達到規範,而必須透過 CAS 管控到程式碼身上才有辨法。

組件的安全性

CAS 是一種用來限制資源被存取的機制,包括檔案、目錄、印表機、網路存取...。 .NET Framework 對每個可以被保護資源各提供一類別,定義在 System.Security.Permissions 命名空間裡。 每個類別都有各自的特定成員,藉以控制相關資源的使用權限。例如:

方法的安全性

前一章節所描述的內容,是針對整個的組件(assembly),進行 CAS 設定以保護組件的安全。 除此之外,也可以針對組件的方法 (method) 做各別的 CAS 設定以保護方法 的安全。 建立方法安全性時,有二種方式:宣告式 (Declaratively) 和命令式 (Imperatively) 。 使用宣告式時,編譯器會在程式碼執行前就做安全性檢查; 使用命令式時,則在程式碼執行中才做安全性檢查,並控制檢查失敗的處理作業。

方法使用權限請求的種類

設定方法的使用權限請求,也是透過 SecurityAction 列舉型別的設定,就可以請求特定的使用權限。 前一章節有介紹到,在 CAS 組件宣告時, SecurityAction 共有三種設定值,但是在 CAS 方法宣告中,則有六種不同的權限請求設定值:

  • Demand ( 要求 ) :堆疊中的所有呼叫端都要有權限。
  • PermitOnly :指明本方法中,僅可以執行的權限,用來降低權限。
  • Assert ( 判斷提示 ) :告訴 runtime ,只要此呼叫端有權限即可,可以忽略再往上層的檢查。
  • Deny ( 拒絕 ) :拒絕某個權限,用來降低權限。
  • LinkDemand ( 連結要求 ) :只要立即呼叫端(直接呼叫的那個呼叫端)有權限即可。
  • InheritanceDemand ( 繼承要求 ) :。

注意1:

其中的 LinkDmand 和 InheritanceDemand 二項,只能用在 Declaratively ,不能用在 Imperatively 。

注意2:

當某個方法的屬性值被設成 Demand 或 LinkDemand ,CAS 並不是檢查目前這個方法的使用權限,而是檢查呼叫的那個方法的使用權限。 Demand 要求所有呼叫端都要檢查;LinkDemand 要求只要檢查直接呼叫端即可。