我正在研究代码访问安全性。它需要付出一些努力来解决问题,所以我认为我最终会使用Reflector并开始研究.NET 4.0如何使用安全属性。
System.IO.File.Delete
方法使用[SecuritySafeCritical]
属性进行修饰。
System.IO.File.Delete
方法委托内部方法 InternalDelete ,该方法使用[SecurityCritical]
属性修饰。
我的一个名为 DeleteFile 的MVC应用程序类中有一个方法正在SecurityTransparent
运行(我已通过检查 DeleteFile 验证了该方法' MethodInfo.IsSecurityCritical属性)
根据我目前的理解,这意味着:
[SecuritySafeCritical]
方法可以调用[SecurityCritical]
,因此不会抛出SecurityException。[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.Delete
的 InternalDelete 方法中,它使用CodeAccessPermission.Demand
方法检查堆栈中的所有呼叫者是否具有必要的权限。我不太了解的是CodeAccessPermission.Demand
的MSDN文档中的这一行:
不检查调用此方法的代码的权限;检查从该代码的直接调用者开始,然后向上移动。
所以我的问题是,如果我的应用程序的 DeleteFile 方法是SecurityTransparent
,那怎么可以调用SecurityCritical
方法?
这可能是一个破旧的例子,或许有一些缺失的概念,但正如我所说,我仍然能够理解它,任何洞察力的人都可以给予我更多的理解。
由于
答案 0 :(得分:0)
你混淆了两种CAS执行机制。虽然他们确实有点互动,但这并不像你似乎担心的那样。出于完全许可要求的目的,如Demand所代表的,它们基本上是独立的。
CLR在执行代码之前应用透明度验证。如果这通过,则CLR将验证通过属性应用的任何声明性CAS要求。如果这些传递(或不存在),CLR将执行代码,此时命令(内联)需求将运行。
有关“未检查调用此方法的代码的权限”的Demand文档说明适用于Demand方法本身。换句话说,如果你有一个方法Foo调用Demand,验证的调用堆栈将启动Foo的调用者,而不是Foo本身。例如,如果您有呼叫链A -> B -> C -> Foo -> Demand
,则只会验证A,B和C以检查他们是否具有授予的权限。