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
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по