Partager via


Sécurisez les constructeurs de sérialisation

Mise à jour : novembre 2007

TypeName

SecureSerializationConstructors

CheckId

CA2120

Catégorie

Microsoft.Security

Modification avec rupture

Oui

Cause

Le type implémente l'interface System.Runtime.Serialization.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 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é.

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 System.Runtime.Serialization.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 ne respecte pas 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

Implémentez des constructeurs de sérialisation

Marquer les types ISerializable avec SerializableAttribute

Voir aussi

Référence

System.Runtime.Serialization.ISerializable

System.Runtime.Serialization.SerializationInfo

System.Runtime.Serialization.StreamingContext