CA2120: Proteger los constructores de serializaciones
Elemento | Valor |
---|---|
RuleId | CA2120 |
Category | Microsoft.Security |
Cambio importante | Problemático |
Causa
El tipo implementa la interfaz System.Runtime.Serialization.ISerializable, no es un delegado ni una interfaz, y se declara en un ensamblado que permite autores de llamada de confianza parcial. El tipo tiene un constructor que toma un objeto System.Runtime.Serialization.SerializationInfo y un objeto System.Runtime.Serialization.StreamingContext (la firma del constructor de serialización). Este constructor no está protegido por una comprobación de seguridad, pero uno o varios de los constructores regulares del tipo están protegidos.
Nota
Esta regla está en desuso. Para más información, consulte Reglas en desuso.
Descripción de la regla
Esta regla es relevante para los tipos que admiten la serialización personalizada. Un tipo admite la serialización personalizada si implementa la interfaz System.Runtime.Serialization.ISerializable. El constructor de serialización es necesario y se usa para deserializar o volver a crear objetos que se han serializado mediante el método System.Runtime.Serialization.ISerializable.GetObjectData. Dado que el constructor de serialización asigna e inicializa objetos, las comprobaciones de seguridad presentes en constructores regulares también deben estar presentes en el constructor de serialización. Si se infringe esta regla, los usuarios que no puedan crear una instancia de otro modo podrían utilizar el constructor de serialización para hacerlo.
Cómo corregir infracciones
Para corregir una infracción de esta regla, proteja el constructor de serialización con demandas de seguridad idénticas a las que protegen otros constructores.
Cuándo suprimir las advertencias
No suprima una infracción de la regla.
Ejemplo
En el ejemplo siguiente se muestra un tipo que infringe la regla.
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);
}
}
}
Reglas relacionadas
CA2229: Implementar constructores de serialización
CA2237: Marcar los tipos ISerializable con SerializableAttribute
Consulte también
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de