有人可以提供一个有用的InheritanceDemand示例(链接)吗?

问题描述:

我有以下类:有人可以提供一个有用的InheritanceDemand示例(链接)吗?

​​

有人可以提供从PrintData继承和/或调用一个重写的PRINTSTRING方法会抛出异常的例子吗?

那么,我终于成功地将一个程序炸毁,作为失败的继承请求的直接原因。 您需要一个包含三个项目的VS解决方案。 首先是基类:

using System; 
using System.IO; 
using System.Security; 
using System.Security.Permissions; 

namespace BaseClass 
{ 
    public abstract class IniPrinterBase 
    { 
     [FileIOPermission(SecurityAction.Deny, AllFiles = FileIOPermissionAccess.Read)] 
     //[RegistryPermission(SecurityAction.InheritanceDemand,Unrestricted = true)] 
     public virtual void PrintIniFile() 
     { 
      ProtectedPrint(); 
     } 

     protected void ProtectedPrint() 
     { 
      try 
      { 
       var lines = File.ReadAllLines(@"G:\test.ini"); 
       foreach (var line in lines) 
       { 
        Console.WriteLine(line); 
       } 
      } 
      catch (SecurityException e) 
      { 

       Console.WriteLine("PRINT OF INI FILE FAILED!"); 
       Console.WriteLine(e.Message); 
      } 
     } 
    } 
} 

然后派生类在不同的项目:

using System.Security.Permissions; 
using BaseClass; 

[assembly:RegistryPermission(SecurityAction.RequestRefuse,Unrestricted = true)] 
namespace DerivedClasses 
{ 
    public class FileIOPermissionExceptionThrower : IniPrinterBase 
    { 
     public override void PrintIniFile() 
     { 
      base.PrintIniFile(); 
     } 
    } 

    public class InheritanceDemandExceptionThrower : IniPrinterBase 
    { 
     public override void PrintIniFile() 
     { 
      ProtectedPrint(); 
     } 
    } 
} 

终于在第三个项目的主要程序:

using System; 
using DerivedClasses; 

namespace MethodSecuritySpike 
{ 
    class Program 
    { 

     static void Main(string[] args) 
     { 
      Console.WriteLine("Printing ini file from security enforced method:"); 
      var printer1 = new FileIOPermissionExceptionThrower(); 
      printer1.PrintIniFile(); 
      Console.WriteLine(); 
      Console.WriteLine("Bypassing security:"); 
      var printer2 = new InheritanceDemandExceptionThrower(); 
      printer2.PrintIniFile(); 
      Console.ReadLine();  
     } 
    } 
} 

为了让这个例子工作您必须引用DerivedClasses程序集中的BaseClass程序集以及MethodSecuritySpike程序集中的BaseClass和DerivedClasses程序集。 此外,做出适当的test.ini文件中的任何其他位置比C盘根:\(否则Windows安全性可以做手脚你)

运行程序(MethodSecuritySpike.exe)。您将首先看到在尝试读取ini文件时捕获到异常,然后会显示ini文件的内容。

接下来,删除BaseClass名称空间中的RegistryPermissionAttribute之前的注释斜杠。运行程序:它拒绝运行!

属性的说明:
在基类:
[FileIOPermission的(SecurityAction.Deny,AllFiles = FileIOPermissionAccess.Read)]
会造成当PrintIniFile在基类调用除外(模拟代码访问安全性尝试阻止访问ini文件的情况) InheritanceDemandExceptionThrower类通过重写PrintIniFile方法并直接调用ProtectedPrint方法来绕过此安全声明。(模拟安全漏洞)


因为DerivedClasses.dll被明确地拒绝了这个权限,所以这个权限是必须的。因为DerivedClasses.dll被明确地拒绝了这个权限,该属性未注释时,程序无法运行。

在DerivedClasses:
[组件:RegistryPermission的(SecurityAction.RequestRefuse,无限制=真)]
指定为RegistryAccess的请求应当被拒绝(模拟部分信任环境)。通常,这不会引发异常,因为DerivedClasses.dll中的类不能访问注册表。 但是,当继承请求激活时,DerivedClasses.dll需要registrypermission能够实例化它的两个类并炸毁。

简单! ;-)