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