任何人都可以解释SecurityAction枚举值的含义和目的吗?
MSDN页面并不十分清楚。它说LinkDemand发生在即时编译中,而需求发生在运行时。
为什么区别和在什么情况下我会使用LinkDemand而不是Demand?
同样,其他有趣的值有什么用例,例如InheritenceDemand,Assert和PermitOnly。
答案 0 :(得分:20)
LinkDemand基本上要求调用代码具有指定的权限。另一方面,需求不仅需要调用代码具有指定的权限,还需要调用调用代码的代码,以及调用它的代码,等等,一直到堆栈(或直到断言被发现;见下文)。
LinkDemand可以在JIT编译时强制执行,因为如果JIT编译器命中一个使用LinkDemand调用方法的语句,它可以立即确定调用代码是否具有权限。每次调用方法时都必须在运行时强制执行需求,因为在编译时不可能知道在任何给定调用期间堆栈上的内容。因此,LinkDemand效率更高。然而,这种效率的权衡是安全性较低。使用LinkDemand,您相信调用代码不会让ITS调用代码(可能有也可能没有权限)将其用于恶意目的。 (换句话说,您相信调用代码中没有安全漏洞,其调用者可以通过LinkDemand间接访问该方法。)对于Demand,您知道堆栈中的每个人都有权限(在至少在找到Assert之前,所以不受信任的呼叫者没有风险。
断言基本上是需求的短路。如果堆栈上的调用者具有活动的Assert(换句话说,只有堆栈中的调用者必须具有该权限),则Demand发生的安全检查会停止。因此,像LinkDemand一样,您必须相信其调用者无法利用带有Assert的代码。
Deny也是Demand的短路,但它不会声明权限,而是取消调用者可能拥有的权限。您可以通过确保在可能被利用的调用期间没有无关的权限生效来帮助防止可能的安全漏洞。
PermitOnly就像Deny,除了拒绝一个特定的权限,它拒绝除了指定的权限之外的每个权限。
与其他方法不同,InheritanceDemand与方法调用没有直接关系,但是说没有权限的类不能从具有InheritanceDemand的类继承。例如,这可以用来阻止不受信任的代码获得对类的受保护成员的访问,否则后代类可以访问这些成员。