Partilhar via


Proteger os construtores de serialização

TypeName

SecureSerializationConstructors

CheckId

CA2120

Category (Categoria)

Microsoft.segurança

Quebrando alterar

Quebrando

Causa

O tipo implementa o System.Runtime.Serialization.ISerializable interface, não é uma interface ou um delegado e é declarada em um assembly que permite aos chamadores parcialmente confiável. O tipo tem um construtor com um System.Runtime.Serialization.SerializationInfo objeto e um System.Runtime.Serialization.StreamingContext objeto (a assinatura do construtor serialização). Esse construtor não é protegida por uma verificação de segurança, mas uma 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 recrie objetos serializados usando o ISerializable.GetObjectData método. Como o construtor de serialização aloca e inicializa a objetos, verificações de segurança que estão presentes em construtores regulares também devem estar presentes no construtor de serialização.Se violam essa 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 dessa 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

Implementar construtores de serialização

Tipos ISerializable marcar com o SerializableAttribute

Consulte também

Referência

System.Runtime.Serialization.ISerializable

System.Runtime.Serialization.SerializationInfo

System.Runtime.Serialization.StreamingContext