Désérialisation automatique dans .NET Framework Remoting

Cette rubrique est spécifique à la technologie héritée assurant la compatibilité descendante avec des applications existantes et n'est pas recommandée en cas de nouveau développement. Les applications distribuées doivent maintenant être développées à l'aide de Windows Communication Foundation (WCF)

Les systèmes de communication à distance qui s'appuient sur une validation de type à l'exécution doivent désérialiser un flux distant pour commencer à l'utiliser. Un client non autorisé pourrait donc essayer de profiter de cet instant. Pour protéger les applications contre ce type d'attaque, .NET Framework Remoting fournit deux niveaux de désérialisation automatique, Low et Full. Low, la valeur par défaut, protège des attaques de désérialisation en ne désérialisant que les types associés aux fonctionnalités de communication à distance les plus basiques, telles que la désérialisation automatique des types d'infrastructure de communication à distance, un jeu limité de types implémentés par le système et un jeu de base de types personnalisés. Le niveau de désérialisation Full prend en charge la désérialisation automatique de tous les types pris en charge par la communication à distance dans toutes les situations.

5dxse167.Caution(fr-fr,VS.100).gifAttention :
Ne partez pas du principe que le contrôle de la désérialisation est la seule sécurité que votre application requiert. Dans des applications distribuées, même un niveau de contrôle élevé de la sérialisation n'empêche pas des clients non autorisés d'intercepter les communications et de les utiliser d'une manière ou d'une autre, même s'il s'agit simplement de montrer 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 la confidentialité de vos données. Pour plus d'informations, consultez Sécurité.

Les listes suivantes décrivent les niveaux de désérialisation de .NET Framework Remoting :

  • Low (niveau par défaut)

    Niveau de désérialisation par défaut dans .NET Framework Remoting. Il prend en charge la désérialisation des types suivants :

    • Objets d'infrastructure de communication à distance. Il s'agit des types requis pour faire fonctionner la communication à distance à un niveau de base.

    • Types primitifs et types référence et valeur composés de types primitifs.

    • Types référence et valeur marqués avec l'attribut SerializableAttribute mais n'implémentant pas l'interface ISerializable.

    • Types fournis par le système qui implémentent ISerializable et ne font pas d'autres demandes en dehors de la sérialisation.

    • Types personnalisés qui ont des noms forts et vivent dans un assembly qui n'est pas marqué avec l'attribut AllowPartiallyTrustedCallersAttribute.

    • Types personnalisés qui implémentent ISerializable et ne font pas d'autres demandes 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 les objets activés par le client) ; le client peut désérialiser le ObjRef retourné, contrairement au serveur.

  • 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 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.

    • Types délégués passés en tant que paramètres.

    • Objets qui héritent de MarshalByRefObject et 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 requiert l'utilisation des fonctionnalités de communication à distance qui sont uniquement disponibles au niveau de désérialisation Full, vous devez fournir le type d'authentification et le niveau de chiffrement nécessaires pour protéger toutes les ressources qui peuvent courir un risque de par l'utilisation de ces fonctionnalités avancées dans des scénarios distants.

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 à l'objet BinaryServerFormatterSinkProvider lors de leur création. Le système de communication à distance définit ensuite la valeur sur le formateur lorsqu'il est inséré 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 explicitement l'attribut typeFilterLevel de l'élément <formatter>. Bien que cela soit généralement effectué côté serveur, vous devez également spécifier cet attribut pour contrôler le niveau de désérialisation de tout canal du client inscrit pour écouter un rappel. L'exemple suivant définit explicitement 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

Concepts

Configuration d'applications distantes