gpt4 book ai didi

.net - 了解 .NET 的 "SecurityAction"权限参数

转载 作者:行者123 更新时间:2023-12-04 13:10:29 25 4
gpt4 key购买 nike

任何人都可以解释 SecurityAction 枚举值的含义和目的吗?

MSDN 页面不是很清楚。它说 LinkDemand 在即时编译时发生,而 Demand 在运行时发生。

为什么会有区别?在什么情况下我会使用 LinkDemand 而不是 Demand?

同样,其他有趣的值(如 InheritenceDemand、Assert 和 PermitOnly)的用例是什么。

最佳答案

LinkDemand 基本上要求调用代码具有指定的权限。另一方面,Demand 不仅要求调用代码具有指定的权限,而且还要求调用调用代码的代码和调用它的代码,等等,一直向上(或直到找到断言;见下文)。

LinkDemand 可以在 JIT 编译时强制执行,因为如果 JIT 编译器命中一个使用 LinkDemand 调用方法的语句,它可以立即确定调用代码是否有权限。每次对方法进行调用时,都必须在运行时强制执行需求,因为在编译时不可能知道任何给定调用期间堆栈上的内容。因此,LinkDemand 效率更高。然而,这种效率的代价是安全性较低。使用 LinkDemand,您相信调用代码不会让 ITS 调用代码(可能有也可能没有权限)将其用于恶意目的。 (换句话说,您相信调用代码中没有安全漏洞,调用者可以利用这些漏洞间接访问 LinkDemand 的方法。)通过 Demand,您知道堆栈上的每个人都绝对拥有权限(在至少直到找到断言为止),因此不存在来自不受信任的调用者的风险。

Assert 基本上是 Demand 的短路。如果堆栈上的调用方具有事件的 Assert(换句话说,只有堆栈中直到 Assert 的调用方必须具有权限),则随 Demand 发生的安全检查将停止。因此,与 LinkDemand 一样,您必须相信带有 Assert 的代码不会被其调用者利用。

Deny 也是 Demand 的短路,但它不是断言权限,而是取消调用者可能拥有的权限。您可以使用此功能通过确保在可能可被利用的调用期间没有有效的无关权限来帮助防止可能的安全漏洞。

PermitOnly 与 Deny 类似,不同之处在于它不是拒绝特定权限,而是拒绝除指定权限之外的所有权限。

InheritanceDemand 与其他方法不同,它与方法调用没有直接关系,但表示没有权限的类不能从具有 InheritanceDemand 的类继承。例如,这可以用来阻止不受信任的代码访问类的 protected 成员,否则这些成员可以被后代类访问。

关于.net - 了解 .NET 的 "SecurityAction"权限参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/353968/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com