代码访问安全性介绍
更新:2007 年 11 月
代码访问安全性是帮助限制代码对受保护的资源和操作的访问权限的一种机制。在 .NET Framework 中,代码访问安全性执行下列功能:
定义权限和权限集,它们表示访问各种系统资源的权限。
使管理员能够通过将权限集与代码组关联来配置安全策略。
使代码能够请求运行所需权限以及其他一些有用的权限,以及指定代码绝对不能拥有哪些权限。
根据代码请求的权限和安全策略允许的操作,向加载的每个程序集授予权限。
使代码能够要求其调用方拥有特定的权限。
使代码能够要求其调用方拥有数字签名,从而只允许特定组织或特定站点的调用方来调用受保护的代码。
通过将调用堆栈上每个调用方所授予的权限与调用方必须拥有的权限相比较,加强运行时对代码的限制。
为了确定是否已授予代码访问资源或执行操作的权限,运行库的安全系统遍历调用堆栈,将每个调用方所授予的权限与目前要求的权限相比较。如果调用堆栈中的任何调用方没有要求的权限,则会引发安全性异常,并会拒绝访问。堆栈步旨在防止引诱攻击;在这种攻击中,受信程度较低的代码调用高度信任的代码,并使用高度信任的代码执行未经授权的操作。在运行时要求所有调用方都拥有权限会影响性能,但这对于帮助保护代码免遭受信程度较低的代码的引诱攻击至关重要。若要优化性能,可以使代码执行较少的堆栈步;但是,任何时候这样做时均必须确保不会暴露安全缺陷。
下图阐释“程序集 A4”中的方法要求其调用方拥有权限 P 时引起的堆栈步。
安全堆栈步
在代码访问安全性的一种常见应用场合中,应用程序将控件从本地 Intranet 宿主网站直接下载到客户端,以便用户能够输入数据。该控件是使用安装的类库生成的。下面是可以在此方案中使用代码访问安全性的一些方法:
在加载时间前,如果代码拥有特定的数字签名,则管理员可配置安全策略来指定给予该代码特殊权利(比本地 Internet 代码通常收到的权限大)。默认情况下,预定义的 LocalIntranet 命名权限集与从本地 Intranet 下载的所有代码关联。
在加载时,除非控件拥有受信任的签名,否则,运行库仅授予控件与 LocalIntranet 命名权限集关联的那些权限。在控件拥有受信任签名的情况下,它会被授予与 LocalIntranet 权限集关联的权限,同时因为其受信任的签名,还可能被授予其他一些权限。
在运行时,每当调用方(在此情况下为寄宿的控件)访问公开受保护资源的库或调用非托管代码的库时,该库便会提出安全要求,它导致对调用方的权限进行检查,检查是否授予了适当的权限。这些安全检查可帮助防止控件在客户端的计算机上执行未经授权的操作。