Partager via


CA2120 : Sécurisez les constructeurs de sérialisation

TypeName

SecureSerializationConstructors

CheckId

CA2120

Catégorie

Microsoft.Security

Modification avec rupture

Oui

Cause

Le type implémente l'interface ISerializable, n'est ni un délégué, ni une interface, et est déclaré dans un assembly qui autorise des appelants dotés d'une confiance partielle.Le type dispose d'un constructeur qui accepte un objet SerializationInfo et un objet 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é.

Description de la règle

Cette règle est pertinente pour les 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 ISerializable.Le constructeur de sérialisation est requis et est utilisé pour désérialiser ou recréer des objets qui ont été sérialisés à l'aide de la méthode ISerializable.GetObjectData.Sachant que le constructeur de sérialisation attribue et initialise des objets, les vérifications de sécurité en vigueur sur les constructeurs normaux doivent également être présentes sur le constructeur de sérialisation.Si vous violez cette règle, les appelants qui ne peuvent normalement pas créer d'instance pourraient utiliser le constructeur de sérialisation pour le faire.

Comment corriger les violations

Pour corriger une violation de cette règle, protégez le constructeur de sérialisation avec des demandes de sécurité identiques à celles qui protègent d'autres constructeurs.

Quand supprimer les avertissements

Ne supprimez aucune violation de la règle.

Exemple

L'exemple suivant présente 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);
        }
    }

 }

Règles connexes

CA2229 : Implémentez des constructeurs de sérialisation

CA2237 : Marquer les types ISerializable avec SerializableAttribute

Voir aussi

Référence

ISerializable

SerializationInfo

StreamingContext