Deserialización automática en .NET Remoting
Los sistemas de interacción remota que dependen de la validación de tipos en tiempo de ejecución deben deserializar una secuencia remota para comenzar a utilizarla, y un cliente no autorizado podría intentar aprovechar el momento de la deserialización. Para protegerse contra este tipo de ataques, .NET remoting proporciona dos niveles de deserialización automática, Low y Full. Low (el valor predeterminado) protege contra los ataques de deserialización mediante la deserialización de sólo los tipos asociados con la funcionalidad de interacción remota más básica, como la deserialización automática de los tipos de infraestructura de interacción remota, un conjunto limitado de tipos implementados por el 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 admite la interacción remota en todos los casos.
PRECAUCIÓN El control de la deserialización no es la única medida de seguridad que requiere su aplicación. En las aplicaciones distribuidas, incluso un alto grado de control de deserialización no impedirá que clientes no autorizados intercepten la comunicación y la utilicen de alguna manera, aunque dicho uso consista sólo en mostrar los datos a terceros. Por tanto, si bien el nivel de deserialización Low ofrece alguna protección contra determinados tipos de ataques basados en la deserialización automática, sigue siendo necesario considerar el uso de la autenticación y la codificación para proteger totalmente los datos. Para obtener más información, vea Seguridad.
En las siguientes listas se describen los niveles de deserialización de .NET remoting:
Low (nivel predeterminado)
El nivel de deserialización predeterminado en .NET remoting admite la deserialización de los siguientes tipos:
- Objetos de la infraestructura de interacción remota. Éstos son los tipos necesarios para que la interacción remota funcione a un nivel básico.
- Tipos primitivos así como tipos de referencia y de valor que se componen de tipos primitivos.
- Tipos de referencia y de valor marcados con el atributo SerializableAttribute pero que no implementan la interfaz ISerializable.
- Tipos proporcionados por el sistema que implementan ISerializable y no realizan ninguna otra solicitud aparte de la serialización.
- Tipos proporcionados por el sistema que implementan ISerializable o están marcados con SerializableAttribute y residen en un ensamblado que no esté marcado con el atributo AllowPartiallyTrustedCallersAttribute.
- Tipos personalizados con nombre seguro que residen en un ensamblado que no esté marcado con el atributo AllowPartiallyTrustedCallersAttribute.
- Tipos personalizados que implementan ISerializable y no realizan ninguna otra solicitud aparte de la serialización.
- Tipos que implementan la interfaz ILease y que no sean objetos MarshalByRefObject.
- Objetos ObjRef utilizados para la activación (para admitir objetos activados en el cliente); es decir, a diferencia del servidor, el cliente puede deserializar el objeto ObjRef devuelto.
Full
El nivel de deserialización Full en .NET remoting admite todos los demás casos, incluida la deserialización de los siguientes tipos adicionales:
- Objetos ObjRef pasados como parámetros.
- Objetos que implementan la interfaz ISponsor.
- Objetos insertados entre la canalización de cliente y proxy mediante la interfaz IContributeEnvoySink.
Si la aplicación necesita utilizar características de interacción remota que sólo están disponibles en el nivel de deserialización Full, es preciso facilitar el tipo de autenticación así como el nivel de codificación necesarios para proteger los recursos que puedan correr algún riesgo por el uso de estas características avanzadas en escenarios remotos.
El nivel de deserialización puede establecerse mediante programación o un archivo de configuración de la aplicación.
Establecer el nivel de deserialización mediante programación
Para establecer el nivel de deserialización mediante programación, pase la siguiente propiedad al objeto SoapServerFormatterSinkProvider o al objeto BinaryServerFormatterSinkProvider en el momento de su creación. A continuación, el sistema de interacción remota establecerá el valor en el formateador cuando se inserte en la cadena de receptores. En el siguiente ejemplo se muestra cómo establecer el nivel de deserialización en Full en un dominio de aplicación host.
[C#]
// 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);
[Visual Basic]
' 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.
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.)
Dim chan As New TcpChannel(props, null, provider)
Establecer el nivel de deserialización mediante un archivo de configuración de la aplicación
Si desea utilizar un archivo de configuración para establecer el nivel de deserialización, especifique explícitamente el atributo typeFilterLevel del elemento <formatter>. Si bien esto suele realizarse en el servidor, también deberá especificar este atributo para controlar el nivel de deserialización de todos los canales en el cliente registrados para escuchar una devolución de llamada. En el siguiente ejemplo se establece explícitamente el nivel de 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>
</configuration>
Vea también
Configuración | RemotingConfiguration | BinaryServerFormatterSinkProvider.TypeFilterLevel | BinaryFormatter.FilterLevel