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