Partager via


Vérifiez la sécurité déclarative dans les types valeur

Mise à jour : novembre 2007

TypeName

ReviewDeclarativeSecurityOnValueTypes

CheckId

CA2108

Catégorie

Microsoft.Security

Modification avec rupture

Modification sans rupture

Cause

Un type valeur public ou protégé est sécurisé par un Accès aux données ou un Demandes de liaison.

Description de la règle

Les types valeur sont alloués et initialisés par leurs constructeurs par défaut avant que d'autres constructeurs s'exécutent. Si un type valeur est sécurisé par une action Demand ou LinkDemand, et si l'appelant ne dispose pas des autorisations qui satisfont la vérification de sécurité, tout constructeur autre que le constructeur par défaut échoue, et une exception de sécurité est levée. Le type valeur n'est pas libéré ; il est laissé dans l'état défini par son constructeur par défaut. Ne comptez pas sur le fait qu'un appelant qui passe une instance du type valeur dispose automatiquement de l'autorisation de créer l'instance ou d'y accéder.

Comment corriger les violations

Vous ne pouvez pas corriger une violation de cette règle à moins de supprimer la vérification de sécurité à partir du type, et d'utiliser en lieu et place des vérifications de sécurité de niveau méthode. Remarquez que ce mode de correction de la violation n'empêche pas des appelants dotés d'autorisations inadéquates d'obtenir des instances du type valeur. Vous devez vous assurer qu'une instance du type valeur, dans son état par défaut, n'expose pas d'informations sensibles, et ne peut pas être utilisée de façon préjudiciable.

Quand supprimer les avertissements

Vous pouvez supprimer un avertissement de cette règle si un appelant peut obtenir des instances du type valeur dans son état par défaut sans que cela constitue une menace pour la sécurité.

Exemple

L'exemple suivant présente une bibliothèque qui contient un type valeur qui enfreint cette règle. Remarquez que le type StructureManager suppose qu'un appelant qui passe une instance du type valeur dispose de l'autorisation de créer l'instance ou d'y accéder.

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

[assembly:AllowPartiallyTrustedCallers]  

namespace SecurityRulesLibrary
{
   // Violates rule: ReviewDeclarativeSecurityOnValueTypes.
   [System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.Demand, Name="FullTrust")]

   public struct SecuredTypeStructure 
   {
      internal double xValue;
      internal double yValue;

      public SecuredTypeStructure(double x, double y) 
      {
         xValue = x;
         yValue = y;
         Console.WriteLine("Creating an instance of SecuredTypeStructure.");
      }     
      public override string ToString()
      {
         return String.Format ("SecuredTypeStructure {0} {1}", xValue, yValue);
      }
   }

   public class StructureManager
   {
      // This method asserts trust, incorrectly assuming that the caller must have 
      // permission because they passed in instance of the value type.
      [System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.Assert, Name="FullTrust")]

      public static SecuredTypeStructure AddStepValue(SecuredTypeStructure aStructure)
      {
         aStructure.xValue += 100;
         aStructure.yValue += 100;
         Console.WriteLine ("New values {0}", aStructure.ToString());
         return aStructure;
      }
   }
}

L'application suivante montre la faiblesse de la bibliothèque.

using System;
using System.Runtime.InteropServices;
using System.Security;
using System.Security.Permissions;
using SecurityRulesLibrary;

// Run this test code with partial trust.
[assembly: System.Security.Permissions.PermissionSetAttribute(
   System.Security.Permissions.SecurityAction.RequestRefuse, 
   Name="FullTrust")]

namespace TestSecurityExamples
{
   public class TestDemandOnValueType
   {
      static SecuredTypeStructure mystruct;

      [STAThread]
      public static void Main() 
      {
         try
         {
            mystruct = new SecuredTypeStructure(10,10);

         }
         catch (SecurityException e)
         {
            Console.WriteLine(
               "Structure custom constructor: {0}", e.Message);
         }

         // The call to the default constructor 
         // does not throw an exception.
         try 
         {
            mystruct = StructureManager.AddStepValue(
               new SecuredTypeStructure());
         }
         catch (SecurityException e)
         {
            Console.WriteLine(
               "Structure default constructor: {0}", e.Message);
         }

         try 
         {
            StructureManager.AddStepValue(mystruct);
         } 

         catch (Exception e)
         {  
            Console.WriteLine(
               "StructureManager add step: {0}", e.Message);
         }
      }
   }
}

Cet exemple génère la sortie suivante :

Structure custom constructor: Request failed.
New values SecuredTypeStructure 100 100
New values SecuredTypeStructure 200 200

Voir aussi

Concepts

Demandes de liaison

Autres ressources

Accès aux données