CA2108 : Vérifiez la sécurité déclarative dans les types valeurCA2108: Review declarative security on value types

TypeNameTypeName ReviewDeclarativeSecurityOnValueTypesReviewDeclarativeSecurityOnValueTypes
CheckIdCheckId CA2108CA2108
CategoryCategory Microsoft.SecurityMicrosoft.Security
Modification avec ruptureBreaking Change Sans ruptureNon Breaking

CauseCause

Un type valeur public ou protégé est sécurisé par un données et modélisation ou les demandes de liaison.A public or protected value type is secured by a Data and Modeling or Link Demands.

Description de la règleRule Description

Types valeur sont alloués et initialisés par leurs constructeurs par défaut avant d’exécutent d’autres constructeurs.Value types are allocated and initialized by their default constructors before other constructors execute. Si un type valeur est sécurisé par une demande ou d’un LinkDemand, et l’appelant n’a pas d’autorisations qui satisfont la vérification de sécurité, un constructeur autre que la valeur par défaut échoue et une exception de sécurité est levée.If a value type is secured by a Demand or LinkDemand, and the caller does not have permissions that satisfy the security check, any constructor other than the default will fail, and a security exception will be thrown. Le type de valeur n’est pas libéré ; Il est conservé dans l’état défini par son constructeur par défaut.The value type is not deallocated; it is left in the state set by its default constructor. Ne supposez pas qu’un appelant qui passe une instance du type valeur est autorisé à créer ou accéder à l’instance.Do not assume that a caller that passes an instance of the value type has permission to create or access the instance.

Comment corriger les violationsHow to Fix Violations

Vous ne pouvez pas corriger une violation de cette règle, sauf si vous supprimez la vérification de sécurité à partir du type, et utiliser la sécurité au niveau méthode vérifie à la place.You cannot fix a violation of this rule unless you remove the security check from the type, and use method level security checks in its place. Notez que la correction de la violation de cette manière n’empêche pas les appelants dotés d’autorisations inadéquates d’obtenir des instances du type valeur.Note that fixing the violation in this manner will not prevent callers with inadequate permissions from obtaining instances of the value type. 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.You must ensure that an instance of the value type, in its default state, does not expose sensitive information, and cannot be used in a harmful manner.

Quand supprimer les avertissementsWhen to Suppress Warnings

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é.You can suppress a warning from this rule if any caller can obtain instances of the value type in its default state without posing a threat to security.

ExempleExample

L’exemple suivant montre une bibliothèque contenant un type valeur qui enfreint cette règle.The following example shows a library containing a value type that violates this rule. Notez que le StructureManager type suppose qu’un appelant qui passe une instance du type valeur dispose d’autorisation de créer ou d’accéder à l’instance.Note that the StructureManager type assumes that a caller that passes an instance of the value type has permission to create or access the instance.

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

ExempleExample

L’application suivante montre la faiblesse de la bibliothèque.The following application demonstrates the library's weakness.

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 produit la sortie suivante.This example produces the following output.

Constructeur personnalisé de structure : échouée de la demande.Structure custom constructor: Request failed.
Nouvelles valeurs SecuredTypeStructure 100 100New values SecuredTypeStructure 100 100
Nouvelles valeurs SecuredTypeStructure 200 200New values SecuredTypeStructure 200 200

Voir aussiSee Also

Demandes de liaison Link Demands
Données et modélisationData and Modeling