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);
        }
    }

 }

CA2229: Implementare costruttori di serializzazione

CA2237: Contrassegnare i tipi ISerializable con SerializableAttribute

Vedi anche