链接要求
更新:2007 年 11 月
链接要求导致在实时编译过程中进行安全检查,并且只检查您的代码的直接调用程序集。当您的代码绑定到类型引用(包括函数指针引用和方法调用)时,就会进行链接。如果调用程序集没有足够的权限来链接到您的代码,则不允许进行链接,并且会在加载和运行该代码时引发运行时异常。可以在从您的代码继承的类中重写链接要求。
注意,对此类型的要求不会执行完整的堆栈步,因而您的代码仍然很容易遭受引诱攻击。例如,如果程序集 A 中的某个方法受某个链接要求保护,则根据程序集 B 的权限评估程序集 B 中的直接调用方。但是,如果程序集 C 中的方法使用程序集 B 中的方法间接调用程序集 A 中的方法,则链接要求不会评估程序集 C 中的方法。链接要求只指定直接调用程序集中的直接调用方为了链接到您的代码所必须拥有的权限。它不指定所有调用方必须拥有哪些权限才能运行您的代码。
Assert、Deny 和 PermitOnly 堆栈审核修饰符不会影响链接要求的评估。因为链接要求不执行堆栈审核,所以堆栈审核修饰符对链接要求没有影响。
如果通过反射访问由链接要求保护的方法,则链接要求会检查通过反射访问的代码的直接调用方。使用反射执行的方法发现和方法调用都是如此。例如,假定代码使用反射来返回一个 MethodInfo 对象(表示由链接要求保护的方法),然后将该 MethodInfo 对象传递给使用该对象调用原始方法的其他一些代码。在这种情况下,链接要求检查会进行两次:一次是检查返回 MethodInfo 对象的代码,另一次是检查调用该对象的代码。
说明: |
---|
对静态类构造函数执行的链接要求不会保护该构造函数,因为静态构造函数是由系统调用的,它们并不包括在应用程序的代码执行路径中。因此,当链接要求应用于整个类时,它无法保护对静态构造函数的访问(尽管它会保护类中的其他部分)。 |
下面的代码段以声明方式指定链接到 ReadData 方法的任何代码都必须拥有 CustomPermission 权限。此权限是假设的自定义权限,在 .NET Framework 中并不存在。通过向 CustomPermissionAttribute 传递一个 SecurityAction.LinkDemand 标志来发出此要求。
<CustomPermissionAttribute(SecurityAction.LinkDemand)> _
Public Shared Function ReadData() As String
' Access a custom resource.
End Function
[CustomPermissionAttribute(SecurityAction.LinkDemand)]
public static string ReadData()
{
// Access a custom resource.
}