2009-06-15 5 views
1

je la classe suivante:Quelqu'un peut-il fournir (un lien vers) un exemple utile d'InheritanceDemand?

[UIPermission(SecurityAction.InheritanceDemand, Window = UIPermissionWindow.AllWindows)] 
    public class PrintData 
    { 
     protected string Data = "secret value"; 

     public virtual void PrintString() 
     { 
      Console.WriteLine(Data); 
     } 
    } 

Quelqu'un peut-il donner un exemple dans lequel héritant de PrintData et/ou l'invocation d'une méthode de printString surchargée va lancer une exception?

Répondre

1

Eh bien, j'ai finalement réussi à faire exploser un programme en tant que cause directe d'un héritage hérité échoué. Vous aurez besoin d'une solution VS avec trois projets. D'abord les baseclass:

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); 
      } 
     } 
    } 
} 

Ensuite, les classes dérivées dans un autre projet:

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(); 
     } 
    } 
} 

et, enfin, le programme principal dans un troisième projet:

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();  
     } 
    } 
} 

Pour faire fonctionner l'exemple vous devez référencer l'assembly BaseClass dans l'assembly DerivedClasses et les assemblys BaseClass et DerivedClasses dans l'assembly MethodSecuritySpike. De plus, créez un fichier test.ini approprié dans un emplacement autre que la racine de C: \ (sinon la sécurité de Windows peut vous jouer des tours)

Exécutez le programme (MethodSecuritySpike.exe). Vous verrez d'abord qu'une exception est interceptée alors que vous essayez de lire le fichier ini, par la suite le contenu du fichier ini est néanmoins affiché.

Ensuite, supprimez les barres de commentaire avant RegistryPermissionAttribute dans l'espace de noms BaseClass. Exécutez le programme: il refuse de fonctionner du tout!

Explication des attributs:
Dans BaseClass:
[FileIOPermission (SecurityAction.Deny, AllFiles = FileIOPermissionAccess.Read)]
forcerai l'exception lorsque la PrintIniFile est invoquée dans la classe de base (Simule un situation dans laquelle le code d'accès de sécurité tente d'empêcher l'accès à un fichier ini) la classe InheritanceDemandExceptionThrower contourne cette déclaration de sécurité en redéfinissant la méthode PrintIniFile et appelant la méthode ProtectedPrint directement. (Simuler une brèche de sécurité)

[RegistryPermission (SecurityAction.InheritanceDemand, Unrestricted = true)]
Requiert que les classes qui héritent de IniPrinterBase aient l'autorisation ci-dessus (arbitrairement choisie car elle aura besoin d'un niveau de confiance élevé) Comme le DerivedClasses.dll est explicitement refusé cette autorisation le le programme ne peut pas s'exécuter lorsque cet attribut est décommenté.

En DerivedClasses:
[assemblage: RegistryPermission (SecurityAction.RequestRefuse, Unrestricted = true)]
Indique qu'une demande de RegistryAccess doit être refusée (simule un environnement de confiance partielle). Normalement, cela ne génère pas d'exception car les classes du fichier DerivedClasses.dll n'accèdent pas au registre. Cependant, lorsque le inheritancedemand est rendu actif, DerivedClasses.dll a besoin de l'autorisation de registre pour être capable d'instancier ses deux classes et de sauter.

Facile! ;-)

Questions connexes