CA2120: обеспечьте безопасность конструкторов сериализации

Товар Значение
Идентификатор правила CA2120
Категория Microsoft.Security
Критическое изменение Критическое

Причина

Тип реализует System.Runtime.Serialization.ISerializable интерфейс, не является делегатом или интерфейсом, и объявляется в сборке, которая позволяет частично доверенным вызывающим объектам. Тип имеет конструктор, который принимает System.Runtime.Serialization.SerializationInfo объект и System.Runtime.Serialization.StreamingContext объект (подпись конструктора сериализации). Этот конструктор не защищен проверка безопасности, но один или несколько обычных конструкторов в типе защищены.

Примечание.

Это правило устарело. Дополнительные сведения см. в разделе "Устаревшие правила".

Описание правила

Это правило относится к типам, поддерживающим пользовательскую сериализацию. Тип поддерживает пользовательскую сериализацию, если реализует интерфейс System.Runtime.Serialization.ISerializable. Конструктор сериализации является обязательным и используется для десериализации или повторного создания объектов, сериализованных с помощью System.Runtime.Serialization.ISerializable.GetObjectData метода. Поскольку конструктор сериализации выделяет и инициализирует объекты, безопасность проверка, присутствующих в обычных конструкторах, также должна присутствовать в конструкторе сериализации. Если это правило нарушается, вызывающие объекты, которые не могли в противном случае создать экземпляр, могут использовать конструктор сериализации для этого.

Устранение нарушений

Чтобы устранить нарушение этого правила, защитите конструктор сериализации с требованиями безопасности, идентичными требованиям защиты других конструкторов.

Когда лучше отключить предупреждения

Не следует подавлять нарушение правила.

Пример

В следующем примере показан тип, нарушающий это правило.

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: применяйте конструкторы сериализации

CA2237: пометьте типы ISerializable атрибутом SerializableAttribute

См. также