Partilhar via


CA2120: Construtores de serialização seguros

Item Valor
RuleId CA2120
Categoria Microsoft.Security
Alteração da falha Quebra

Causa

O tipo implementa a interface System.Runtime.Serialization.ISerializable, não é um delegado nem uma interface e é declarado em um assembly que permite chamadores parcialmente confiáveis. O tipo tem um construtor que usa um objeto System.Runtime.Serialization.SerializationInfo e um objeto System.Runtime.Serialization.StreamingContext (a assinatura do construtor de serialização). Esse construtor não é protegido por uma verificação de segurança, mas um ou mais dos construtores regulares no tipo é protegido.

Observação

Esta regra foi preterida. Para obter mais informações, confira Regras preteridas.

Descrição da regra

Essa regra é relevante para tipos que dão suporte à serialização personalizada. Um tipo dá suporte à serialização personalizada se implementar a interface System.Runtime.Serialization.ISerializable. O construtor de serialização é necessário e é usado para desserializar ou recriar objetos que foram serializados usando o método System.Runtime.Serialization.ISerializable.GetObjectData. Como o construtor de serialização aloca e inicializa objetos, as verificações de segurança presentes em construtores regulares também precisam estar presentes no construtor de serialização. Se você violar essa regra, os chamadores que não conseguiram criar uma instância poderiam usar o construtor de serialização para fazer isso.

Como corrigir violações

Para corrigir uma violação dessa regra, proteja o construtor de serialização com demandas de segurança idênticas às que protegem outros construtores.

Quando suprimir avisos

Não suprime uma violação da regra.

Exemplo

O seguinte exemplo mostra um tipo que viola a regra.

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: Implementar construtores de serialização

CA2237: Marcar tipos ISerializable com SerializableAttribute

Confira também