.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 安全性如何真正发挥作用?的主要内容,如果未能解决你的问题,请参考以下文章

如何成为一家真正发挥大数据作用的 “数据驱动型公司”?

如何在asp.net中真正注销

WebAssembly在软件生态系统中将继续发挥更大的作用

WebAssembly在软件生态系统中将继续发挥更大的作用

如何轻松解决五个VMware安全漏洞

该如何发挥我的文档的作用