CA2120: обеспечьте безопасность конструкторов сериализации
TypeName |
SecureSerializationConstructors |
CheckId |
CA2120 |
Категория |
Microsoft.Security |
Критическое изменение |
Критическое изменение |
Причина
Тип реализует интерфейс ISerializable, не является делегатом или интерфейсом и объявляется в сборке, которая разрешает вызовы с неполным доверием.Тип содержит конструктор, который принимает объект SerializationInfo и объект StreamingContext (подпись конструктора сериализации).Этот конструктор не защищен проверкой безопасности, однако один или несколько обычных конструкторов этого типа защищены.
Описание правила
Данное правило распространяется на типы, поддерживающие пользовательскую сериализацию.Чтобы поддерживать пользовательскую сериализацию, тип должен реализовывать интерфейс 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