代码访问安全性 - 了解SecurityTransparent可以调用SecurityCritical的原因

时间:2012-05-11 11:48:51

标签: c# asp.net .net security code-access-security

我正在研究代码访问安全性。它需要付出一些努力来解决问题,所以我认为我最终会使用Reflector并开始研究.NET 4.0如何使用安全属性。

观察

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

System.IO.File.Delete方法委托内部方法 InternalDelete ,该方法使用[SecurityCritical]属性修饰。

我的一个名为 DeleteFile 的MVC应用程序类中有一个方法正在SecurityTransparent运行(我已通过检查 DeleteFile 验证了该方法' MethodInfo.IsSecurityCritical属性)

权限

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

  1. System.IO.File.Delete可以调用 InternalDelete ,因为[SecuritySafeCritical]方法可以调用[SecurityCritical],因此不会抛出SecurityException。
  2. DeleteFile 可以调用System.IO.File.Delete,因为[SecurityTransparent]可以调用[SecuritySafeCritical]
  3. 所以基本上,如果不调整任何开箱即用的安全设置,这段代码将成功删除一个名为test.txt的虚拟文件

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

    混乱

    System.IO.File.Delete InternalDelete 方法中,它使用CodeAccessPermission.Demand方法检查堆栈中的所有呼叫者是否具有必要的权限。我不太了解的是CodeAccessPermission.Demand的MSDN文档中的这一行:

      

    不检查调用此方法的代码的权限;检查从该代码的直接调用者开始,然后向上移动。

    所以我的问题是,如果我的应用程序的 DeleteFile 方法是SecurityTransparent,那怎么可以调用SecurityCritical方法?

    这可能是一个破旧的例子,或许有一些缺失的概念,但正如我所说,我仍然能够理解它,任何洞察力的人都可以给予我更多的理解。

    由于

1 个答案:

答案 0 :(得分:0)

你混淆了两种CAS执行机制。虽然他们确实有点互动,但这并不像你似乎担心的那样。出于完全许可要求的目的,如Demand所代表的,它们基本上是独立的。

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

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