Partager via


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

Mise à jour : novembre 2007

TypeName

SecuredTypesShouldNotExposeFields

CheckId

CA2112

Catégorie

Microsoft.Security

Modification avec rupture

Oui

Cause

Un type public ou protégé contient des champs publics et est sécurisé par un Demandes de liaison.

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 une 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 du champ. Les vérifications de la sécurité LinkDemand appliquées à des types protègent l'accès aux propriétés et aux méthodes de ce type. Toutefois, la sécurité d'accès du code ne s'applique pas aux champs.

Quand supprimer les avertissements

Pour des questions de sécurité et de design dans les règles de l'art, 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 ne fondez aucune opération sur le contenu du champ.

Exemple

L'exemple suivant est composé d'un type (SecuredTypeWithFields) de bibliothèque doté de champs non sécurisés ; d'un type (Distributor) qui peut créer des instances du type de la bibliothèque et qui passe par erreur des instances à des types qui n'ont pas l'autorisation de les créer, et d'un code d'application qui peut lire les champs d'une instance bien qu'il ne dispose pas de l'autorisation qui sécurise 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);
      }
   }
}

L'application ne peut pas créer d'instance à cause 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);
      }
   }
}

L'application suivante montre comment, sans autorisation d'accès aux méthodes du 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 génère la sortie suivante :

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

Règles connexes

Ne pas déclarer de champs d'instances visibles

Voir aussi

Concepts

Demandes de liaison

Autres ressources

Accès aux données