Considérations de sécurité System.Xml
Les sections suivantes traitent des types de problèmes de sécurité pouvant se produire lors de l'utilisation des composants System.Xml et des mesures à prendre pour réduire ces menaces.
Remarque |
---|
Les composants System.Xml se basent sur le système de sécurité .NET Framework de Microsoft.Cette rubrique n'aborde que les problèmes de sécurité spécifiquement traités par les classes XML.Pour plus d'informations, voir Sécurité dans le .NET Framework. |
Classe XmlResolver
Classes XmlReader et XmlReaderSettings
Classe XmlTextReader
Classe XslCompiledTransform
Document Object Model
Classe XmlResolver
La classe XmlResolver permet de résoudre des ressources.Elle permet de charger des documents XML, de résoudre des ressources externes (entités, DTD ou schémas) et d'importer ou d'inclure des directives..NET Framework inclut deux implémentations de la classe XmlResolver.
La classe XmlUrlResolver constitue le programme de résolution par défaut de toutes les classes dans l'espace de noms System.Xml.Elle prend en charge les requêtes et les protocoles file:// et http:// de la classe WebRequest.Dans de nombreux cas, si vous ne spécifiez pas l'objet XmlResolver que votre application doit utiliser, un objet XmlUrlResolver sans informations d'identification de l'utilisateur permet d'accéder aux ressources XML.
La classe XmlSecureResolver permet de sécuriser un autre objet XmlResolver en englobant l'objet XmlResolver et en limitant les ressources auxquelles la classe XmlResolver sous-jacente a accès.Par exemple, la classe XmlSecureResolver peut refuser l'accès à des zones ou sites Internet particuliers.
Tenez compte des considérations suivantes lorsque vous utilisez la classe XmlResolver.
Les objets XmlResolver peuvent contenir des informations confidentielles telles que des informations d'identification de l'utilisateur qui permettent d'accéder aux données et de les récupérer.Soyez prudent lorsque vous mettez en cache des objets XmlResolver et ne transmettez jamais l'objet XmlResolver à un composant non fiable, car ce dernier pourrait utiliser l'objet XmlResolver et les informations d'identification qu'il contient pour accéder à des données.
Si vous concevez une propriété de classe qui utilise la classe XmlResolver, cette propriété doit être définie comme étant en écriture seule.La propriété peut servir à spécifier l'objet XmlResolver à utiliser, mais pas à retourner un objet XmlResolver.Cela permet à un composant non fiable d'utiliser la classe, mais pas de récupérer et utiliser directement l'objet XmlResolver.
Si votre application accepte des objets XmlResolver provenant d'un code non fiable, vous ne pouvez pas présumer que l'URI transmis par la méthode GetEntity est identique à celui retourné par la méthode ResolveUri.Les classes dérivées de la classe XmlResolver peuvent se substituer à la méthode GetEntity et retourner des données différentes de ce qui était contenu dans l'URI d'origine.
Votre application peut diminuer le risque d'attaques de type déni de service sur la méthode GetEntity en implémentant un IStream dans une enveloppe qui limite le nombre d'octets lus.Cela contribue à prévenir les situations où un code malveillant tente de passer un flux infini d'octets à la méthode GetEntity.
Classes XmlReader et XmlReaderSettings
Pratiquement tous les composants System.Xml sont construits sur le concept de l'analyse du XML.Par exemple, la classe XmlDocument utilise la classe XmlReader pour analyser un document et construire une représentation en mémoire du document XML.
Nous recommandons d'utiliser la méthode Create pour créer des objets XmlReader.La classe XmlReaderSettings spécifie l'ensemble de fonctionnalités à activer sur l'objet XmlReader.
Limitation de la taille d'expansion des documents et des entités
L'utilisation de la mémoire par une application qui se sert de XmlReader peut être en rapport avec la taille du document XML analysé.Une forme d'attaque par déni de service consiste à envoyer des documents XML extrêmement volumineux pour analyse.
Lorsque vous utilisez XmlReader, vous pouvez restreindre la taille du document qu'il sera possible d'analyser en définissant la propriété MaxCharactersInDocument.Définissez la propriété MaxCharactersFromEntities pour limiter le nombre maximal de caractères résultant des extensions d'entités.Consultez les rubriques de référence appropriées pour obtenir des exemples de définition de ces propriétés.
Traitement DTD
Le traitement DTD peut entraîner une condition de déni de service.Par exemple, la DTD peut contenir des entités imbriquées ou des modèles de contenu complexes pouvant prendre un temps de traitement interminable.
Le traitement des DTD est désactivé par défaut.Un objet XmlException est levé lorsque l'objet XmlReader rencontre des données DTD.
Traitement des schémas
Les indicateurs de validation ProcessInlineSchema et ProcessSchemaLocation d'un objet XmlReaderSettings ne sont pas activés par défaut.Cela contribue à protéger l'objet XmlReader contre les attaques basées sur des schémas lorsqu'il traite des données XML provenant d'une source non fiable.Lorsque ces indicateurs sont activés, la propriété XmlResolver de l'objet XmlReaderSettings est utilisée pour résoudre les emplacements de schéma rencontrés dans le document d'instance dans l'objet XmlReader.Si la propriété XmlResolver est définie sur null, les emplacements de schémas ne sont pas résolus, même si les indicateurs de validation ProcessInlineSchema et ProcessSchemaLocation sont activés.
Les schémas ajoutés lors de la validation ajoutent de nouveaux types et peuvent changer le résultat de la validation du document en cours de validation.Par conséquent, les schémas externes ne devraient être résolus que s'ils proviennent de sources fiables.
Nous recommandons de désactiver l'indicateur ProcessIdentityConstraints (activé par défaut) lors de la validation de documents XML volumineux non fiables dans des scénarios de haute disponibilité par rapport à un schéma présentant des contraintes d'identité sur une grande partie du document.
Ressources externes
Les données XML peuvent inclure des références à des ressources externes telles qu'un fichier de schéma.Par défaut, les ressources externes sont résolues à l'aide d'un objet XmlUrlResolver sans informations d'identification de l'utilisateur.Cela signifie que, par défaut, vous pouvez accéder à n'importe quel emplacement n'exigeant aucune information d'identification.Vous pouvez renforcer la sécurisation en effectuant l'une des opérations suivantes :
Limitez les ressources auxquelles XmlReader peut accéder en définissant la propriété XmlReaderSettings.XmlResolver sur un objet XmlSecureResolver.
Empêchez l'objet XmlReader d'ouvrir des ressources externes en définissant la propriété XmlReaderSettings.XmlResolver sur null.
Partage d'objets XmlReaderSettings
Les objets XmlReaderSettings peuvent contenir des informations confidentielles telles que des informations d'identification de l'utilisateur.Un composant non fiable pourrait utiliser l'objet XmlReaderSettings et ses informations d'identification pour créer des objets XmlReader afin de lire des données.Soyez prudent lorsque vous mettez en cache des objets XmlReaderSettings ou que vous transmettez l'objet XmlReaderSettings d'un composant à un autre.
Composants de prise en charge
- N'acceptez pas les composants de prise en charge, tels que les objets NameTable, XmlNamespaceManager et XmlResolver provenant d'une source non fiable.
Traitement des données
Les données XML peuvent contenir un grand nombre d'attributs, de déclarations d'espaces de noms, d'éléments imbriqués, etc. exigeant un temps de traitement long.
Vous pouvez créer une implémentation IStream personnalisée qui limite la taille de l'entrée utilisée et la fournir à la classe XmlReader.
Utilisez la méthode ReadValueChunk pour traiter de grands flux de données.Cette méthode lit un petit nombre de caractères à la fois au lieu d'allouer une seule chaîne à toute la valeur.
Classe XmlTextReader
La classe XmlTextReader est une ancienne implémentation de la classe XmlReader.
Traitement DTD
Le traitement des DTD est activé par défaut.Pour désactiver le traitement des DTD, définissez la propriété DtdProcessing sur Prohibit.
Gestion d'entités
Par défaut, les entités générales ne sont pas développées.Les entités générales sont développées lorsque vous appelez la méthode ResolveEntity.
Ressources externes
Les données XML peuvent inclure des références à des ressources externes telles que des références DTD.Par défaut, les ressources externes sont résolues à l'aide d'un objet XmlUrlResolver sans informations d'identification de l'utilisateur.
Vous pouvez renforcer la sécurité en procédant comme suit :
Limitez les ressources auxquelles XmlTextReader peut accéder en définissant la propriété XmlResolver sur un objet XmlSecureResolver.
Empêchez l'objet XmlTextReader d'ouvrir des ressources externes en définissant la propriété XmlResolver sur null.
Classe XslCompiledTransform
La classe XslCompiledTransform est un processeur XSLT qui prend en charge la syntaxe XSL 1.0.Elle permet de transformer des données XML à l'aide d'une feuille de style XSLT.
Ressources externes
Les feuilles de style peuvent contenir des références à des ressources externes telles que des éléments xsl:import ou xsl:include ou la fonction document().
La classe XslCompiledTransform prend en charge les éléments xsl:import ou xsl:include par défaut.La classe XslCompiledTransform désactive la prise en charge de la fonction document() par défaut.La classe XsltSettings permet d'activer la fonction document().
Les méthodes Load et Transform comprennent des surcharges qui prennent un objet XmlResolver comme l'un de leurs arguments.Si aucun XmlResolver n'est spécifié, un XmlUrlResolver par défaut sans informations d'identification est utilisé.
Vous pouvez contrôler l'accès aux ressources externes en effectuant l'une des opérations suivantes :
Limitez les ressources auxquelles le processus XSLT peut accéder à l'aide d'un objet XmlSecureResolver.
Empêchez le processus XSLT d'ouvrir des ressources externes en transmettant la valeur null à l'argument XmlResolver.
Blocs de script
Par défaut, la classe XslCompiledTransform ne prend pas en charge les blocs de script.La classe XsltSettings permet d'activer les blocs de script.Le script XSLT ne doit être activé que si la prise en charge des scripts est nécessaire et si vous travaillez dans un environnement totalement fiable.
Objets d'extension
Les objets d'extension ajoutent des capacités de programmation aux transformations XSLT.Cette fonction est activée par défaut.Si des objets d'extension sont transmis à la méthode Transform, ils sont utilisés dans la transformation XSLT.
Modèle DOM (Document Object Model)
Puisque le DOM met en cache toutes les données en mémoire, les opérations DOM telles que l'interrogation, l'édition, le déplacement de sous-arborescences entre documents et l'enregistrement d'objets DOM ne sont pas recommandées si vous travaillez avec des données non fiables et si vous craignez des attaques de type déni de service.Une autre possibilité consiste à définir une limite de la quantité de données lues dans le DOM.L'une des manières de procéder est de créer une implémentation de flux personnalisée qui limite la taille de l'entrée et d'utiliser cette implémentation pour charger l'objet DOM.
Des objets XmlDocument peuvent contenir des informations confidentielles telles que des informations d'identification de l'utilisateur dans l'objet XmlResolver intégré.Si la propriété XmlDocument.XmlResolver est définie sur un objet XmlResolver contenant des informations d'identification de l'utilisateur, ne mettez pas en cache l'objet XmlDocument et ne le transmettez pas à un composant non fiable.Un composant non fiable pourrait utiliser l'objet DOM et les informations d'identification contenues dans l'objet XmlResolver intégré pour accéder à des données et les charger.