Désérialisation automatique dans .NET Framework 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 car un client non autorisé pourrait tenter d'exploiter le moment de désérialisation. Pour se protéger contre ce type d'attaque, .NET Framework 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'infrastructures 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.
Avertissement
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 chiffrement doivent être utilisés pour protéger vos données. Pour plus d'informations, voir Sécurité.
Les listes suivantes détaillent les niveaux de désérialisation de .NET Framework Remoting :
Low (niveau par défaut)
Le niveau de désérialisation par défaut dans .NET Framework 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 et 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 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 (afin de 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 Framework Remoting prend en charge tous les autres scénarios, y compris la désérialisation des autres types 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.
Types délégués passés en tant que paramètres.
Objets qui héritent de MarshalByRefObject passés en tant que paramètres.
Types ISerializable passés en tant que paramètres.
Types stockés dans le GAC et non marqués avec l'attribut AllowPartiallyTrustedCallersAttribute.
Si votre application a besoin d'utiliser des fonctionnalités d'accès distant disponibles uniquement au niveau de désérialisation Full, vous devez fournir le type d'authentification et le niveau de chiffrement 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 sur le 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.
// 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)
Définition du niveau de désérialisation à l'aide d'un fichier de configuration d'application
Pour utiliser un fichier de configuration afin de 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>
</system.runtime.remoting>
</configuration>
Voir aussi
Référence
RemotingConfiguration
BinaryServerFormatterSinkProvider.TypeFilterLevel
BinaryFormatter.FilterLevel