CA2120 : Sécurisez les constructeurs de sérialisation

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

Cause

Le type implémente l’interface System.Runtime.Serialization.ISerializable, n’est pas un délégué ou une interface et est déclaré dans un assembly qui autorise les appelants partiellement fiables. Le type a un constructeur qui accepte un objet System.Runtime.Serialization.SerializationInfo et un objet System.Runtime.Serialization.StreamingContext (la signature du constructeur de sérialisation). Ce constructeur n’est pas sécurisé par une vérification de la sécurité, mais au moins un des constructeurs normaux dans le type est sécurisé.

Notes

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

Description de la règle

Cette règle s’applique aux types qui prennent en charge la sérialisation personnalisée. Un type prend en charge la sérialisation personnalisée s’il implémente l’interface System.Runtime.Serialization.ISerializable. Le constructeur de sérialisation est obligatoire et est utilisé pour désérialiser ou recréer des objets qui ont été sérialisés à l’aide de la méthode System.Runtime.Serialization.ISerializable.GetObjectData. Étant donné que le constructeur de sérialisation alloue et initialise des objets, les contrôles de sécurité présents sur les constructeurs réguliers doivent également être présents sur le constructeur de sérialisation. Si vous ne respectez pas cette règle, les appelants qui n’ont pas pu créer une instance peuvent utiliser le constructeur de sérialisation pour ce faire.

Comment corriger les violations

Pour corriger une violation de cette règle, protégez le constructeur de sérialisation avec des exigences de sécurité identiques à celles protégeant d’autres constructeurs.

Quand supprimer les avertissements

Ne supprimez pas une violation de la règle.

Exemple

L’exemple suivant montre un type qui enfreint la règle.

using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Security;
using System.Security.Permissions;

[assembly: AllowPartiallyTrustedCallersAttribute()]
namespace SecurityRulesLibrary
{   
    [Serializable]
    public class SerializationConstructorsRequireSecurity : ISerializable 
    {
        private  int n1;
        // This is a regular constructor secured by a demand.
        [FileIOPermissionAttribute(SecurityAction.Demand, Unrestricted = true)]
        public SerializationConstructorsRequireSecurity ()
        {
           n1 = -1;
        }
        // This is the serialization constructor.
        // Violates rule: SecureSerializationConstructors.
        protected SerializationConstructorsRequireSecurity (SerializationInfo info, StreamingContext context)
        {
           n1 = (int) info.GetValue("n1", typeof(int));
        }
        void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
        {
           info.AddValue("n1", n1);
        }
    }

 }

CA2229 : Implémentez des constructeurs de sérialisation

CA2237 : Marquer les types ISerializable avec SerializableAttribute

Voir aussi