Поделиться через


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

TypeName

SecureSerializationConstructors

CheckId

CA2120

Категория

Microsoft.Security

Критическое изменение

Критическое изменение

Причина

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

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

Данное правило распространяется на типы, поддерживающие пользовательскую сериализацию. Чтобы поддерживать пользовательскую сериализацию, тип должен реализовывать интерфейс System.Runtime.Serialization.ISerializable. Требуется конструктор сериализации, которые десериализует, или повторно создает, объекты, сериализованные с помощью метода 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

См. также

Ссылки

System.Runtime.Serialization.ISerializable

System.Runtime.Serialization.SerializationInfo

System.Runtime.Serialization.StreamingContext