CA2120: Proteger os construtores de serialização

TypeName

SecureSerializationConstructors

CheckId

CA2120

<strong>Categoria</strong>

Microsoft.Security

Alteração significativa

Quebrando

Causa

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

Descrição da regra

Essa regra é relevante para tipos que oferecem suporte a serialização personalizada. Um tipo oferece suporte a serialização personalizada se ele implementa o System.Runtime.Serialization.ISerializable interface. O construtor de serialização é necessário e é usado para desserializar ou recriar os objetos que tiverem sido serializados usando o ISerializable.GetObjectData método. Como o construtor de serialização aloca e inicializa os objetos, as verificações de segurança estão presentes em construtores regulares também devem ser presentes no construtor de serialização. Se você violar esta regra, os chamadores caso contrário, não foi possível criar uma instância poderiam usar o construtor de serialização para fazer isso.

Como corrigir violações

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

Quando suprimir avisos

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

Exemplo

O exemplo a seguir 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);
        }
    }

 }

Regras relacionadas

CA2229: Implementar os construtores de serialização

CA2237: Tipos de ISerializable de marca com o SerializableAttribute

Consulte também

Referência

System.Runtime.Serialization.ISerializable

System.Runtime.Serialization.SerializationInfo

System.Runtime.Serialization.StreamingContext