CA2120: Proteggere i costruttori di serializzazione
TypeName |
SecureSerializationConstructors |
CheckId |
CA2120 |
Category |
Microsoft.Security |
Breaking Change |
Breaking |
Causa
Il tipo implementa l'interfaccia ISerializable, non è un delegato né un'interfaccia ed è dichiarato in un assembly che consente i chiamanti parzialmente attendibili.Il tipo dispone di un costruttore che accetta un oggetto SerializationInfo e un oggetto StreamingContext (la firma del costruttore di serializzazione).Questo costruttore non è protetto da un controllo di sicurezza, ma uno o più costruttori regolari nel tipo sono protetti.
Descrizione della regola
Questa regola si applica ai tipi che supportano la serializzazione personalizzata.Un tipo supporta la serializzazione personalizzata se implementa l'interfaccia ISerializable.Il costruttore di serializzazione è richiesto e viene utilizzato per deserializzare o ricreare oggetti serializzati mediante il metodo ISerializable.GetObjectData.Poiché il costruttore di serializzazione alloca e inizializza oggetti, i controlli di sicurezza presenti sui costruttori regolari devono anche essere presenti sul costruttore di serializzazione.Se si viola questa regola, i chiamanti che non possono creare in altro modo un'istanza possono utilizzare a tal fine il costruttore di serializzazione.
Come correggere le violazioni
Per correggere una violazione di questa regola, proteggere il costruttore di serializzazione con richieste di sicurezza identiche a quelle che proteggono gli altri costruttori.
Esclusione di avvisi
Non escludere una violazione da questa regola.
Esempio
Nell'esempio riportato di seguito viene illustrato un tipo che viola la regola.
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);
}
}
}
Regole correlate
CA2229: Implementare costruttori di serializzazione
CA2237: Contrassegnare i tipi ISerializable con SerializableAttribute