2009-06-15 7 views

答えて

1

まあ、私は最終的には、失敗した継承者の直接の原因としてプログラムが爆発することに成功しました。 3つのプロジェクトで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(); 
     } 
    } 
} 

と3番目のプロジェクトで最終的にメインプログラム:

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の前にあるコメントスラッシュを削除します。プログラムを実行する:それはまったく実行を拒否する!属性の

説明:基底クラスで
:PrintIniFileがベースクラスにが呼び出されたとき
[FileIOPermission(SecurityAction.Deny、ALLFILES = FileIOPermissionAccess.Read)]
は、例外が発生します(Aシミュレートコードアクセスセキュリティがiniファイルへのアクセスを防止しようとする状況) InheritanceDemandExceptionThrowerクラスは、PrintIniFileメソッドをオーバーライドしてProtectedPrintメソッドを直接呼び出すことにより、このセキュリティ宣言をバイパスします(セキュリティ侵害のシミュレーション)

(信頼性レベルが高いため任意に選択されています) DerivedClasses.dllがこのアクセス許可を明示的に拒否されているため、この属性のコメントを外すとプログラムが実行されません。 DerivedClassesで


[アセンブリ:RegistryPermission(SecurityAction.RequestRefuse、無制限=真)]
は(部分信頼環境をシミュレートする)RegistryAccessの要求が拒否されなければならないことを指定します。 DerivedClasses.dllのクラスはレジストリにアクセスしないため、通常これは例外をスローしません。 しかし、継承されたメールがアクティブになると、DerivedClasses.dllは2つのクラスをインスタンス化して爆発することができるようにregistrypermissionを必要とします。

Easy! ;-)

関連する問題