.NET 安全性如何真正发挥作用?
Posted
技术标签:
【中文标题】.NET 安全性如何真正发挥作用?【英文标题】:How does .NET security really work? 【发布时间】:2010-09-26 03:36:55 【问题描述】:我刚看到这个问题:
Understanding .NET’s “SecurityAction” parameter for permissions
我有一个问题。使用以下代码:
private void button1_Click(object sender, EventArgs e)
Layer1();
MessageBox.Show("OK");
private void Layer1()
try
Layer2();
catch (SecurityException)
MessageBox.Show("Caught");
Layer2b();
private void Layer2()
new System.Security.Permissions.FileIOPermission(PermissionState.Unrestricted).Deny();
GC.Collect();
Layer3();
private void Layer2b()
Layer3();
[FileIOPermission(SecurityAction.LinkDemand, Write=@"C:\temp")]
private void Layer3()
using (FileStream stream = new FileStream(@"C:\temp\test.txt", FileMode.Create))
为什么代码在调用Layer2
时会产生安全异常?如何处理权限对象,我想垃圾收集器会销毁该对象,因为我没有对它的活动引用,但是代码说 Caught,然后 好的,很明显,权限拒绝对通过 Layer2 的调用有效。
什么给了?我错过了什么?当谈到 .NET 中的安全/权限系统时,我承认自己是一个完全的初学者,所以如果这个问题真的很基础,请原谅我。
这样的安全许可/拒绝是否会标记堆栈或其他东西?否则,为什么对 Layer2b 无效?这是同一个线程,很明显,虽然它没有被垃圾收集杀死,但它会在某个时候被删除/销毁/清理。
【问题讨论】:
附带说明,您的代码中的安全异常不会由于 Layer3 方法上的 LinkDemand 而发生。它是由于 FileStream 类中的需求而发生的。 LinkDemands 不受 Deny(或 Assert 或 PermitOnly)的影响。 对....好吧...猜猜这是我去寻找一个很好的信息来源的线索。谢谢! 【参考方案1】:乍一看,我猜权限对象仍然在作用域内,因为它是在方法内部定义的,所以在 Layer2 方法完成后它就超出了作用域,从而允许您的应用程序的最后一行运行.
正如接受的答案所指出的,这是因为它在当前堆栈的范围内,与标准对象范围相关,您只是不管理引用。这是最好的记忆方式
【讨论】:
不,绝对不可能。如果收集器运行,您没有活动引用的对象将被垃圾收集,我明确强制它。由于我不再使用该对象(没有引用)它应该被收集,我猜是它,它只是先调整了堆栈。 我为我的措辞道歉,它就像一个对象,但您不管理引用。在您的示例中,它会一直保留在堆栈上,直到方法退出。表现得像一个变量声明。【参考方案2】:在 CodeAccessPermission 上调用 .Deny() 将导致 .NET 安全运行时在当前堆栈帧的安全对象上为该权限设置拒绝标志。 因此,即使您在调用 .Deny() 之后调用 GC.Collect(),也没关系,权限将保持有效。权限对象只是 .NET 安全运行时部分在某个时间点(堆栈帧)的状态表示。
只需使用 .NET Reflector 即可了解更多信息。
【讨论】:
我确实尝试过使用反射器,但我只深入研究了这些方法中的代码,我想我需要进一步深入研究权限对象。以上是关于.NET 安全性如何真正发挥作用?的主要内容,如果未能解决你的问题,请参考以下文章