Udostępnij za pośrednictwem


CA2120: Zabezpieczaj konstruktory serializacji

Pozycja Wartość
Ruleid CA2120
Kategoria Microsoft.Security
Zmiana powodująca niezgodność Kluczowa

Przyczyna

Typ implementuje System.Runtime.Serialization.ISerializable interfejs, nie jest delegatem ani interfejsem i jest zadeklarowany w zestawie, który umożliwia częściowo zaufanym obiektom wywołującym. Typ ma konstruktor, który przyjmuje System.Runtime.Serialization.SerializationInfo obiekt i System.Runtime.Serialization.StreamingContext obiekt (podpis konstruktora serializacji). Ten konstruktor nie jest zabezpieczony przez sprawdzanie zabezpieczeń, ale jeden lub więcej zwykłych konstruktorów w typie jest zabezpieczony.

Uwaga

Ta reguła została przestarzała. Aby uzyskać więcej informacji, zobacz Przestarzałe reguły.

Opis reguły

Ta reguła jest odpowiednia dla typów, które obsługują serializację niestandardową. Typ obsługuje serializację niestandardową System.Runtime.Serialization.ISerializable , jeśli implementuje interfejs. Konstruktor serializacji jest wymagany i służy do usuwania serializacji lub ponownego tworzenia obiektów, które zostały serializowane przy użyciu System.Runtime.Serialization.ISerializable.GetObjectData metody . Ponieważ konstruktor serializacji przydziela i inicjuje obiekty, kontrole zabezpieczeń, które znajdują się na zwykłych konstruktorach, również muszą być obecne w konstruktorze serializacji. Jeśli naruszysz tę regułę, wywołujące, które nie mogły w inny sposób utworzyć wystąpienia, może użyć konstruktora serializacji, aby to zrobić.

Jak naprawić naruszenia

Aby naprawić naruszenie tej reguły, należy chronić konstruktor serializacji przy użyciu wymagań zabezpieczeń, które są identyczne z tymi, które chronią inne konstruktory.

Kiedy pomijać ostrzeżenia

Nie pomijaj naruszenia reguły.

Przykład

W poniższym przykładzie pokazano typ, który narusza regułę.

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: Zaimplementuj konstruktory serializacji

CA2237: Oznacz typy ISerializable za pomocą atrybutu SerializableAttribute

Zobacz też