Compartir a través de


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

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

System.Runtime.Serialization.SerializationInfo

System.Runtime.Serialization.StreamingContext