CA2112 : Les types sécurisés ne doivent pas exposer de champs

Élément Valeur
ID de la règle CA2112
Category Microsoft.Security
Modification avec rupture Rupture

Cause

Un type public ou protégé contient des champs publics, et est sécurisé par des vérifications LinkDemand.

Notes

Cette règle est déconseillée. Pour plus d’informations, consultez Règles dépréciées.

Description de la règle

Si un code a accès à une instance d’un type sécurisé par une demande de liaison, ce code n’a pas besoin de satisfaire la demande de liaison pour accéder aux champs du type.

Comment corriger les violations

Pour corriger toute violation de cette règle, rendez les champs non publics, et ajoutez des propriétés ou des méthodes publiques qui retournent les données de champ. Les vérifications de sécurité LinkDemand des types protègent l’accès aux propriétés et aux méthodes du type. Toutefois, la sécurité d’accès du code ne s’applique pas aux champs.

Quand supprimer les avertissements

Pour éviter les problèmes de sécurité et pour une bonne conception, vous devez corriger les violations en rendant les champs publics non publics. Vous pouvez supprimer un avertissement de cette règle si le champ ne contient pas d’informations qui doivent rester sécurisées, et si vous n’avez pas besoin du contenu du champ.

Exemple

L’exemple suivant est composé d’un type de bibliothèque (SecuredTypeWithFields) avec des champs non sécurisés, d’un type (Distributor) qui peut créer des instances du type de bibliothèque et qui passe par erreur des instances à des types n’ayant pas l’autorisation nécessaire pour les créer ainsi que d’un code d’application qui peut lire les champs d’une instance même s’il ne dispose pas de l’autorisation permettant de sécuriser le type.

Le code de bibliothèque suivant enfreint la règle.

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

namespace SecurityRulesLibrary
{
   // This code requires immediate callers to have full trust.
   [System.Security.Permissions.PermissionSetAttribute(
       System.Security.Permissions.SecurityAction.LinkDemand, 
       Name="FullTrust")]
   public class SecuredTypeWithFields 
   {
      // Even though the type is secured, these fields are not.
      // Violates rule: SecuredTypesShouldNotExposeFields.
      public double xValue;
      public double yValue;
      
      public SecuredTypeWithFields (double x, double y) 
      {
         xValue = x;
         yValue = y;
         Console.WriteLine(
            "Creating an instance of SecuredTypeWithFields.");
      }
      public override string ToString()
      {
          return String.Format (
            "SecuredTypeWithFields {0} {1}", xValue, yValue);
      }
   }
}

Exemple 1

L’application ne peut pas créer d’instance en raison de la demande de liaison qui protège le type sécurisé. La classe suivante permet à l’application d’obtenir une instance du type sécurisé.

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

// This assembly executes with full trust. 

namespace SecurityRulesLibrary
{
   // This type creates and returns instances of the secured type.
   // The GetAnInstance method incorrectly gives the instance 
   // to a type that does not have the link demanded permission.

   public class Distributor
   {
      static SecuredTypeWithFields s = new SecuredTypeWithFields(22,33);
      public static SecuredTypeWithFields GetAnInstance ()
      {
            return s;
      }

      public static void DisplayCachedObject ()
      {
         Console.WriteLine(
            "Cached Object fields: {0}, {1}", s.xValue , s.yValue);
      }
   }
}

Exemple 2

L’application suivante montre comment, sans autorisation d’accès aux méthodes d’un type sécurisé, le code peut accéder à ses champs.

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

// This code executes with partial trust.
[assembly: System.Security.Permissions.PermissionSetAttribute(
   System.Security.Permissions.SecurityAction.RequestRefuse,
   Name = "FullTrust")]
namespace TestSecurityExamples
{
    public class TestLinkDemandOnField
    {
        [STAThread]
        public static void Main()
        {
            // Get an instance of the protected object.
            SecuredTypeWithFields secureType = Distributor.GetAnInstance();

            // Even though this type does not have full trust,
            // it can directly access the secured type's fields.
            Console.WriteLine(
               "Secured type fields: {0}, {1}",
               secureType.xValue,
               secureType.yValue);
            Console.WriteLine("Changing secured type's field...");
            secureType.xValue = 99;

            // Distributor must call ToString on the secured object.
            Distributor.DisplayCachedObject();

            // If the following line is uncommented, a security 
            // exception is thrown at JIT-compilation time because 
            // of the link demand for full trust that protects 
            // SecuredTypeWithFields.ToString().

            // Console.WriteLine("Secured type {0}",secureType.ToString());
        }
    }
}

Cet exemple produit la sortie suivante :

Creating an instance of SecuredTypeWithFields.
Secured type fields: 22, 33
Changing secured type's field...
Cached Object fields: 99, 33

Voir aussi