图 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
延伸阅读
文章来源于领测软件测试网 https://www.ltesting.net/