gpt4 book ai didi

c# - 代码访问安全 - 理解为什么 SecurityTransparent 可以调用 SecurityCritical

转载 作者:太空狗 更新时间:2023-10-29 22:01:30 25 4
gpt4 key购买 nike

我正在研究代码访问安全性。我花了一些力气才开始思考,所以我想我最终会使用 Reflector 并开始研究 .NET 4.0 如何使用安全属性。

观察

System.IO.File.Delete 方法用 [SecuritySafeCritical] 属性修饰。

System.IO.File.Delete 方法委托(delegate)给内部方法 InternalDelete,它用 [SecurityCritical] 属性修饰。

我的一个 MVC 应用程序类中有一个名为 DeleteFile 的方法,它作为 SecurityTransparent 运行(我已经通过检查 DeleteFile 进行了验证> 的 MethodInfo.IsSecurityCritical 属性)

权限

根据我目前的理解,这意味着:

  1. System.IO.File.Delete 可以调用 InternalDelete,因为 [SecuritySafeCritical] 方法可以调用 [SecurityCritical],因此不会抛出 SecurityException。
  2. DeleteFile 可以调用 System.IO.File.Delete 因为 [SecurityTransparent] 可以调用 [SecuritySafeCritical]

所以基本上,无需调整任何开箱即用的安全设置,此代码将成功删除名为 test.txt 的虚拟文件

namespace MyTestMvcApp
{
public class FileHelpers()
{
// Has SecurityTransparent
public void DeleteFile()
{
// Will succesfully delete the file
File.Delete("test.txt");
}
}
}

困惑

System.IO.File.DeleteInternalDelete 方法中,它使用 CodeAccessPermission.Demand 方法来检查所有调用者堆栈具有必要的权限。我不太明白的是 CodeAccessPermission.Demand 的 MSDN 文档中的这一行:

The permissions of the code that calls this method are not examined; the check begins from the immediate caller of that code and proceeds up the stack.

所以我的问题是,如果我的应用程序的DeleteFile 方法是SecurityTransparent,为什么允许调用SecurityCritical 方法?

这可能是一个错误的例子,可能缺少一些概念,但正如我所说,我仍在思考它,任何人都可以提供更多见解,我会加深理解。

谢谢

最佳答案

您混淆了两种 CAS 执行机制。虽然他们确实有一些互动,但与您担心的方式并不完全相同。对于以 Demand 为代表的完全权限需求,它们本质上是独立的。

CLR 在执行代码之前应用透明度验证。如果通过,CLR 将验证通过属性应用的任何声明性 CAS 要求。如果这些通过(或不通过),CLR 将执行代码,此时命令式(内联)需求将运行。

有关“不检查调用此方法的代码的权限”的 Demand 文档说明适用于 Demand 方法本身。换句话说,如果您有一个调用 Demand 的方法 Foo,则经过验证的调用堆栈将从 Foo 的调用者开始,而不是 Foo 本身。例如,如果您有调用链 A -> B -> C -> Foo -> Demand,则只有 A、B 和 C 将被验证以检查他们是否具有授予的权限。

关于c# - 代码访问安全 - 理解为什么 SecurityTransparent 可以调用 SecurityCritical,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10550751/

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