Proteger los constructores de serialización
Actualización: noviembre 2007
Nombre de tipo |
SecureSerializationConstructors |
Identificador de comprobación |
CA2120 |
Categoría |
Microsoft.Security |
Cambio problemático |
Sí |
Motivo
El tipo implementa la interfaz System.Runtime.Serialization.ISerializable, no es un delegado o ni una interfaz, y se declara en un ensamblado que permite llamadores que no son de plena confianza. 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). Una comprobación de seguridad no protege este constructor, pero protege uno o más constructores regulares del tipo.
Descripción de la regla
Esta regla es relevante para los tipos que admiten la serialización personalizada. Un tipo es compatible con la serialización personalizada si implementa la interfaz System.Runtime.Serialization.ISerializable. Se requiere el constructor de serialización y se utiliza para deserializar o volver a crear objetos que se han serializado utilizando el método 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 infringe esta regla, los llamadores que no pudieron crear una instancia podrían utilizar el constructor de serialización para ello.
Cómo corregir infracciones
Para corregir una infracción de esta regla, proteja el constructor de serialización con solicitudes de seguridad idénticas a las que protegen otros constructores.
Cuándo suprimir advertencias
No suprima ninguna infracción de la regla.
Ejemplo
El siguiente ejemplo 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
Implementar constructores de serialización
Marcar los tipos ISerializable con SerializableAttribute
Vea también
Referencia
System.Runtime.Serialization.ISerializable