Condividi tramite


CA2120: 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 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 System.Runtime.Serialization.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

Vedere anche

Riferimenti

System.Runtime.Serialization.ISerializable

System.Runtime.Serialization.SerializationInfo

System.Runtime.Serialization.StreamingContext