圖 3. 堆棧審核示例
函數可以選擇修改堆棧審核,有一些機制可完成這種修改。首先,一個函數可能需要確定調用它的多個函數。在這種情形下,它可以斷言一個特定的權限。如果發生了查找斷言權限的堆棧審核,那么在檢查這個函數的激活記錄以尋找該權限時,如果該函數具有它斷言的權限,則檢查成功,堆棧審核將會終止。斷言本身是一個受保護操作,因為它將向斷言訪問受保護資源權限的函數的所有調用方開放對該受保護資源的訪問權限。因此,在運行庫中,安全系統會檢查包含自我斷言的函數的程序集是否具有它試圖斷言的權限。
修改堆棧審核的另一種辦法是支持函數拒絕權限。當一個函數知道它不應該訪問某個資源并拒絕權限時,就可能發生這種情形。PermitOnly 提供了類似 deny 的功能,因為它會導致堆棧審核失敗。但 deny 指定的是會導致堆棧審核失敗的權限集,而 PermitOnly 指定的則是繼續堆棧審核所需的權限集。
注在使用 Deny 堆棧修飾符時,應該小心。如果早期的堆棧幀是一個斷言,則會忽略 Deny 修飾符。另外,拒絕基于路徑的權限是相當困難的,這是因為經常有各種不同的路徑字符串實際是指向相同位置的。拒絕一個特定路徑表達式仍會開放其他的路徑。
還有最后一個需要知道的要點。在任何時刻,一個堆棧幀只能有一個 Deny、一個 PermitOnly 和一個 Assert 處于有效狀態。例如,如果開發人員需要斷言許多權限,他們就應該創建一個 PermissionSet 來表示該集合,并只進行一個單獨的斷言。有一些方法可用來刪除一個堆棧審核修飾符的當前 PermissionSet 設置,以便注冊其他的權限集。此類方法的一個示例是 System.Security.CodeAccessPermission.RevertPermitOnly。
下面的示例說明了前面介紹的各種堆棧修改技術:
using System;
using System.Security;
using System.Security.Permissions;
namespace PermissionDemand
{
class EntryPoint
延伸閱讀
文章來源于領測軟件測試網 http://www.kjueaiud.com/