Proteggere i costruttori di serializzazione
TypeName |
SecureSerializationConstructors |
CheckId |
CA2120 |
Category |
Microsoft.Security |
Breaking Change |
Breaking |
Causa
Il tipo implementa l'interfaccia System.Runtime.Serialization.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 System.Runtime.Serialization.SerializationInfo e un oggetto System.Runtime.Serialization.StreamingContext (la firma del costruttore di serializzazione). Questo costruttore non è protetto da un controllo di protezione, 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 System.Runtime.Serialization.ISerializable. Il costruttore di serializzazione è richiesto e viene utilizzato per deserializzare o ricreare oggetti serializzati mediante il metodo System.Runtime.Serialization.ISerializable.GetObjectData(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext). Poiché il costruttore di serializzazione alloca e inizializza oggetti, i controlli di protezione 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.
Correzione di violazioni
Per correggere una violazione di questa regola, proteggere il costruttore di serializzazione con richieste di protezione 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
Proteggere gli override di GetObjectData
Implementare costruttori di serializzazione
Contrassegnare i tipi ISerializable con Serializable
Vedere anche
Riferimenti
System.Runtime.Serialization.ISerializable
System.Runtime.Serialization.SerializationInfo
System.Runtime.Serialization.StreamingContext