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);
}
}
}
Règles associées
CA2229 : Implémentez des constructeurs de sérialisation
CA2237 : Marquer les types ISerializable avec SerializableAttribute
Voir aussi
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour