Compartir a través de


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);
        }
    }

 }

CA2229: Implementar constructores de serialización

CA2237: Marcar los tipos ISerializable con SerializableAttribute

Consulte también