Désérialisation automatique dans .NET Remoting
Les systèmes d'accès distant qui reposent sur une validation du type de runtime doivent désérialiser un flux distant pour commencer à l'utiliser et un client non autorisé pourrait tenter d'exploiter le moment de désérialisation. Pour se protéger contre ce type d'attaque, .NET Remoting offre deux niveaux de désérialisation automatique : Low et Full. Low (valeur par défaut) assure une protection contre les attaques de désérialisation en désérialisant uniquement les types associés à la fonctionnalité d'accès distant la plus basique, telle que la désérialisation automatique de types d'infrastructure d'accès distant, un ensemble limité de types implémentés par le système et un ensemble de types personnalisés de base. Le niveau de désérialisation Full prend en charge la désérialisation automatique de tous les types que l'accès distant prend en charge dans toutes les situations.
ATTENTION Le contrôle de la désérialisation n'est pas la seule sécurité dont votre application a besoin. Dans des applications distribuées, même un degré élevé de contrôle de la sérialisation n'empêche pas des clients non autorisés d'intercepter la communication et de l'utiliser d'une certaine manière, même s'il s'agit simplement d'afficher les données à d'autres personnes. Par conséquent, même si le niveau de désérialisation Low offre une protection contre certains types d'attaques basées sur la désérialisation automatique, vous devez néanmoins déterminer si l'authentification et le cryptage doivent être utilisés pour protéger vos données. Pour plus d'informations, consultez Sécurité.
Les listes suivantes décrivent les niveaux de désérialisation de .NET Remoting :
Low (niveau par défaut)
Le niveau de désérialisation par défaut dans .NET Remoting prend en charge la désérialisation des types suivants :
- Objets d'infrastructure d'accès distant. Il s'agit des types nécessaires pour faire fonctionner l'accès distant à un niveau de base.
- Types primitifs ainsi que les types valeur et référence composés de types primitifs.
- Types référence et valeur marqués avec l'attribut SerializableAttribute mais qui n'implémentent pas l'interface ISerializable.
- Types fournis par le système, implémentant ISerializable et ne faisant aucune autre demande en dehors de la sérialisation.
- Types fournis par le système, qui implémentent ISerializable ou sont marqués avec SerializableAttribute et résident dans un assembly qui n'est pas marqué avec l'attribut AllowPartiallyTrustedCallersAttribute.
- Types personnalisés avec des noms forts, résidant dans un assembly qui n'est pas marqué avec l'attribut AllowPartiallyTrustedCallersAttribute.
- Types personnalisés, implémentant ISerializable et ne faisant aucune autre demande en dehors de la sérialisation.
- Types qui implémentent l'interface ILease et ne sont pas des objets MarshalByRefObject.
- Objets ObjRef utilisés pour l'activation (pour prendre en charge des objets activés par le client) ; cela signifie que le client peut désérialiser l'objet ObjRef retourné mais que le serveur ne peut pas en faire autant.
Full
Le niveau de désérialisation Full de .NET Remoting prend en charge tous les autres scénarios, y compris la désérialisation des types supplémentaires suivants :
- Objets ObjRef passés en tant que paramètres.
- Objets qui implémentent l'interface ISponsor.
- Objets insérés entre le proxy et le pipeline client par l'interface IContributeEnvoySink.
Si votre application a besoin d'utiliser des fonctionnalités d'accès distant uniquement disponibles au niveau de désérialisation Full, vous devez fournir le type d'authentification et le niveau de cryptage nécessaires pour protéger les ressources susceptibles de courir un risque en utilisant ces fonctionnalités avancées dans des scénarios d'accès distant.
Vous pouvez définir le niveau de désérialisation par programme ou en utilisant un fichier de configuration d'application.
Définition du niveau de désérialisation par programme
Pour définir le niveau de désérialisation par programme, passez la propriété suivante à l'objet SoapServerFormatterSinkProvider ou BinaryServerFormatterSinkProvider au moment de la création. Le système d'accès distant définit ensuite la valeur du formateur au moment de son insertion dans la chaîne de récepteurs. L'exemple suivant montre comment définir le niveau de désérialisation Full dans un domaine d'application hôte.
[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)
Définition du niveau de désérialisation à l'aide d'un fichier de configuration d'application
Pour utiliser un fichier de configuration pour définir le niveau de désérialisation, vous devez spécifier, de manière explicite, l'attribut typeFilterLevel de l'élément <formatter>. Même si cela est généralement effectué du côté serveur, vous devez également spécifier cet attribut pour contrôler le niveau de désérialisation de n'importe quel canal sur le client inscrit pour écouter un rappel. L'exemple suivant définit, de manière explicite, le niveau de désérialisation Low pour SoapFormatter et BinaryFormatter dans le domaine d'application.
<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>
Voir aussi
Configuration | RemotingConfiguration | BinaryServerFormatterSinkProvider.TypeFilterLevel | BinaryFormatter.FilterLevel