CA2120: Zabezpečte serializační konstruktory

Zboží Hodnota
RuleId CA2120
Kategorie Microsoft.Security
Změna způsobující chybu Narušující

Příčina

Typ implementuje System.Runtime.Serialization.ISerializable rozhraní, není delegát nebo rozhraní a je deklarován v sestavení, které umožňuje částečně důvěryhodné volající. Typ má konstruktor, který přebírá System.Runtime.Serialization.SerializationInfo objekt a System.Runtime.Serialization.StreamingContext objekt (podpis konstruktoru serializace). Tento konstruktor není zabezpečen kontrolou zabezpečení, ale jeden nebo více běžných konstruktorů v typu je zabezpečen.

Poznámka:

Toto pravidlo je zastaralé. Další informace najdete v tématu Zastaralá pravidla.

Popis pravidla

Toto pravidlo je relevantní pro typy, které podporují vlastní serializaci. Typ podporuje vlastní serializaci, pokud implementuje System.Runtime.Serialization.ISerializable rozhraní. Serializační konstruktor je povinný a používá se k de-serializaci nebo znovu vytvořit objekty, které byly serializovány pomocí System.Runtime.Serialization.ISerializable.GetObjectData metody. Vzhledem k tomu, že serializační konstruktor přiděluje a inicializuje objekty, musí být v konstruktoru serializace přítomny také kontroly zabezpečení, které jsou přítomné u běžných konstruktorů serializace. Pokud toto pravidlo porušujete, volající, kteří by jinak nemohli vytvořit instanci, by k tomu mohli použít konstruktor serializace.

Jak opravit porušení

Chcete-li opravit porušení tohoto pravidla, chraňte serializační konstruktor s požadavky zabezpečení, které jsou identické s těmi, které chrání ostatní konstruktory.

Kdy potlačit upozornění

Nepotlačujte porušení pravidla.

Příklad

Následující příklad ukazuje typ, který porušuje pravidlo.

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: Implementovat serializační konstruktory

CA2237: Označte typy ISerializable pomocí SerializableAttribute

Viz také