Compartir a través de


Deserialización automática en la comunicación remota de .NET Framework

Este tema es específico de una tecnología heredada que se mantiene para la compatibilidad con versiones anteriores con aplicaciones existentes y no se recomienda para nuevo desarrollo. Las aplicaciones distribuidas se deberían desarrollar utilizando  Windows Communication Foundation (WCF).

Los sistemas remotos que confían en la validación de tipo en tiempo de ejecución deben deserializar una secuencia remota para empezar a utilizarla y un cliente no autorizado podría intentar aprovecharse del momento de deserialización. Para ayudar a protegerse contra este tipo de ataque, la comunicación remota de .NET Framework proporciona dos niveles de deserialización automática, Low y Full. Low, el valor predeterminado, protege contra los ataques de deserialización al deserializar solamente los tipos asociados a la funcionalidad de la comunicación remota más básica, como la deserialización automática de tipos de infraestructura remota, un conjunto limitado de tipos implementados del sistema y un conjunto básico de tipos personalizados. El nivel de deserialización Full admite la deserialización automática de todos los tipos que la comunicación remota admite en todas las situaciones.

5dxse167.Caution(es-es,VS.100).gifPrecaución:
No suponga que controlar la deserialización es la única seguridad que requiere su aplicación. En aplicaciones distribuidas, incluso un alto grado de control sobre la serialización no impide que clientes no autorizados intercepten la comunicación y la utilicen de algún modo, aunque solamente sea mostrando los datos a otros usuarios. Por lo tanto, aunque el nivel de deserialización Low proporciona algo de protección contra determinados tipos de ataque basándose en la deserialización automática, usted deberá evaluar si va a utilizar la autenticación y el cifrado para ayudarle a proteger la confidencialidad de los datos. Para obtener información detallada, vea Seguridad.

Las siguientes listas describen los niveles de la deserialización remota de .NET Framework:

  • Low (nivel predeterminado)

    El nivel de la deserialización predeterminado en comunicación remota de .NET Framework admite la deserialización de los tipos siguientes:

    • Objetos de la infraestructura remota. Éstos son los tipos exigidos para que la comunicación remota funcione a un nivel básico.

    • Tipos primitivos y tipos de referencia y de valor que se crean a partir de los tipos primitivos.

    • La referencia y tipos de valor que se marcan con el atributo Atributo serializable pero no implementan la interfaz ISerializable.

    • Tipos proporcionados por sistema que implementan ISerializable y no realizan otra demanda fuera de la serialización.

    • Tipos personalizados con nombres seguros y que viven en un ensamblado que no se marca con el atributo AllowPartiallyTrustedCallersAttribute.

    • Tipos personalizados que implementan ISerializable y no realizan otra demanda fuera de la serialización.

    • Tipos que implementan la interfaz ILease y no son los objetos MarshalByRefObject.

    • Objetos ObjRef utilizados para la activación (para admitir los objetos activados en el cliente); es decir, el cliente puede deserializar el ObjRef devuelto pero el servidor no puede.

  • Full

    El nivel de deserialización Full en la comunicación remota de .NET Framework admite el resto de escenarios, incluso la deserialización de los tipos adicionales siguientes:

    • Los objetos ObjRef pasados como parámetros.

    • Los objetos que implementan la interfaz ISponsor.

    • Objetos que se insertan entre el proxy y el conductor del cliente por la interfaz IContributeEnvoySink.

    • Los tipos de delegado pasados como parámetros.

    • Objects que se heredan de MarshalByRefObject pasados como parámetros.

    • Los tipos ISerializable pasados como parámetros.

    • Los tipos almacenados en la GAC y no marcados con el atributo AllowPartiallyTrustedCallersAttribute.

    Si su aplicación requiere el uso de características de comunicación remota que solo están disponibles en el nivel de deserialización Full, debe proporcionar el tipo de autenticación y el nivel de cifrado necesario para proteger cualquier recurso que podría estar en el riesgo al utilizar estas características avanzadas en escenarios remotos.

Puede establecer el nivel de deserialización mediante programación o utilizando un archivo de configuración de la aplicación.

Establezca el nivel de deserialización mediante programación

Para establecer el nivel de deserialización mediante programación, pase la propiedad siguiente al objeto SoapServerFormatterSinkProvider o el objeto BinaryServerFormatterSinkProvider en creación. A continuación, el sistema remoto establece el valor en el formateador cuando se inserta en la cadena de receptores. El ejemplo siguiente muestra cómo establecer el nivel de la deserialización en Full en un dominio de la aplicación del host.

// Creating a custom formatter for a TcpChannel sink chain.
BinaryServerFormatterSinkProvider provider = new BinaryServerFormatterSinkProvider();
provider.TypeFilterLevel = TypeFilterLevel.Full;
// Creating the IDictionary to set the port on the channel instance.
IDictionary props = new Hashtable();
props["port"] = 8085;
// Pass the properties for the port setting and the server provider in the server chain argument. (Client remains null here.)
TcpChannel chan = new TcpChannel(props, null, provider);
' Creating a custom formatter for your TcpChannel sink chain.
Dim provider As New BinaryServerFormatterSinkProvider()
provider.TypeFilterLevel = TypeFilterLevel.Full
' Creating the IDictionary to set the port on the channel instance.
Dim props As IDictionary = New Hashtable()
props("port") = 8085
' Pass the properties for the port setting and the server provider in the server chain argument. (Client remains null here.)
Dim chan As New TcpChannel(props, DBNull.Value, provider)

Establecer el nivel de la deserialización mediante un archivo de configuración de la aplicación

Para utilizar un archivo de configuración para establecer el nivel de la deserialización, debe especificar explícitamente el atributo typeFilterLevel del elemento <formatter>. Aunque esto se hace normalmente en el lado del servidor, también debe especificar este atributo para controlar el nivel de la deserialización para cualquier canal del cliente registrado para realizar escuchas para una devolución de llamada. El ejemplo siguiente establece explícitamente el nivel de la deserialización en Low para SoapFormatter y BinaryFormatter en el dominio de aplicación.

<configuration>
<system.runtime.remoting>
<application>
<service>
<wellknown 
type="ServiceType, common" 
objectUri="ServiceType.soap" 
mode="Singleton" 
/>
</service>
<channels>
<channel ref="http">
<serverProviders> 
<provider ref="wsdl" />
<formatter ref="soap" typeFilterLevel=Low />
<formatter ref="binary" typeFilterLevel=Low />
</serverProviders>
</channel>
</channels>
</application>
</system.runtime.remoting>
</configuration>

Vea también

Referencia

RemotingConfiguration
BinaryServerFormatterSinkProvider.TypeFilterLevel
BinaryFormatter.FilterLevel

Conceptos

Configuración de aplicaciones remotas