如何.NET安全真的有用吗?
-
21-08-2019 - |
题
我刚刚看到这个问题:
和我有个问题。用下面的代码:
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
?许可对象是怎样治疗的,我想像垃圾收集器会破坏对象,因为我没有主动提及它,但代码表示的夹缝的,然后的行,所以明确许可拒绝是在通过二层呼叫的效果。
是怎么回事?我在想什么?我承认自己是一个总的初学者,当谈到.NET中的安全性/许可制度所以请原谅我,如果这个问题真的是基本的。
是否安全许可/拒绝这样标志堆栈或什么?否则,为何不能在Layer2b影响?这是同一个线程,所以很显然,虽然它不是由垃圾收集杀死,它是越来越删除/销毁/在某个时候清理了。
解决方案
上的CodeAccessPermission调用.Deny()将导致.NET安全运行时设定为许可的当前堆栈帧的安全对象上的拒绝标志。 所以,即使你调用.Deny()后调用GC.Collect(),它并没有真正的问题,允许将保持有效。权限对象只是一个在一个时间点(堆栈帧)的.NET安全运行时的部分的状态的表示。
只要使用.NET反射来了解更多信息。
其他提示
在第一次看,我猜想,权限对象仍处于范围,因为它是该方法中定义的,它超出范围的二层法完成后,由此允许应用程序对函数的最后一行
正如接受的答案指出,这是监守它的范围是当前栈,与标准的对象范围,你不管理的参考。这是要记住它的最好办法
不隶属于 StackOverflow