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);
}
}
}
Regras relacionadas
CA2229: Implementar construtores de serialização
CA2237: Marcar tipos ISerializable com SerializableAttribute
Confira também
Comentários
https://aka.ms/ContentUserFeedback.
Brevemente: Ao longo de 2024, vamos descontinuar progressivamente o GitHub Issues como mecanismo de feedback para conteúdos e substituí-lo por um novo sistema de feedback. Para obter mais informações, veja:Submeter e ver comentários