CA2120: Proteggere i costruttori di serializzazione
Articolo | Valore |
---|---|
ID regola | CA2120 |
Category | Microsoft.Security |
Modifica | Interruzione |
Causa
Il tipo implementa l'interfaccia System.Runtime.Serialization.ISerializable , non è un delegato o un'interfaccia e viene dichiarato in un assembly che consente chiamanti parzialmente attendibili. Il tipo ha un costruttore che accetta un System.Runtime.Serialization.SerializationInfo oggetto e un System.Runtime.Serialization.StreamingContext oggetto (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.
Nota
Questa regola è stata deprecata. Per altre informazioni, vedere Regole deprecate.
Descrizione regola
Questa regola è rilevante per i tipi che supportano la serializzazione personalizzata. Un tipo supporta la serializzazione personalizzata se implementa l'interfaccia System.Runtime.Serialization.ISerializable . Il costruttore di serializzazione è obbligatorio e viene usato per de-serializzare o ricreare oggetti serializzati tramite il System.Runtime.Serialization.ISerializable.GetObjectData metodo . Poiché il costruttore di serializzazione alloca e inizializza gli oggetti, i controlli di sicurezza presenti nei costruttori regolari devono essere presenti anche nel costruttore di serializzazione. Se si viola questa regola, i chiamanti che non potevano altrimenti creare un'istanza potrebbero usare il costruttore di serializzazione per eseguire questa operazione.
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 altri costruttori.
Quando eliminare gli avvisi
Non eliminare una violazione della regola.
Esempio
Nell'esempio seguente 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
Vedi anche
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per