CA5369 : Utiliser XmlReader pour la désérialisation

Propriété Value
Identificateur de la règle CA5369
Titre Utiliser XmlReader pour la désérialisation
Catégorie Sécurité
Le correctif est cassant ou non cassant Sans rupture
Activé par défaut dans .NET 8 Non

Cause

La désérialisation d’une entrée XML non approuvée avec un XmlSerializer.Deserialize instancié sans objet XmlReader peut entraîner un déni de service, la divulgation d’informations et des attaques de falsification de requêtes côté serveur. Ces attaques sont activées par le traitement de schéma DTD et XML non approuvé, ce qui permet d’inclure des bombes XML et des entités externes malveillantes dans le code XML. Seul XmlReader permet de désactiver DTD. Le traitement du schéma XML inline comme XmlReader a la propriété ProhibitDtd et ProcessInlineSchema définie sur false par défaut dans .NET Framework version 4.0 et ultérieures. Les autres options, telles que Stream, TextReader et XmlSerializationReader, ne peuvent pas désactiver le traitement DTD.

Description de la règle

Le traitement de schémas DTD et XML non approuvés peut permettre le chargement de références externes dangereuses, qui doivent être restreintes à l’aide d’un XmlReader avec un programme de résolution sécurisé ou avec le traitement de schéma inclus DTD et XML désactivé. Cette règle détecte le code qui utilise la classe XmlSerializer.Deserialize et ne prend pas XmlReader comme paramètre de constructeur.

Comment corriger les violations

N’utilisez pas de surcharges XmlSerializer.Deserialize autres que Deserialize(XmlReader), Deserialize(XmlReader, String), Deserialize(XmlReader, XmlDeserializationEvents) ou Deserialize(XmlReader, String, XmlDeserializationEvents).

Quand supprimer les avertissements

Vous pouvez potentiellement supprimer cet avertissement si le code XML analysé provient d’une source approuvée et ne peut donc pas être falsifié.

Supprimer un avertissement

Si vous voulez supprimer une seule violation, ajoutez des directives de préprocesseur à votre fichier source pour désactiver et réactiver la règle.

#pragma warning disable CA5369
// The code that's violating the rule is on this line.
#pragma warning restore CA5369

Pour désactiver la règle sur un fichier, un dossier ou un projet, définissez sa gravité sur none dans le fichier de configuration.

[*.{cs,vb}]
dotnet_diagnostic.CA5369.severity = none

Pour plus d’informations, consultez Comment supprimer les avertissements de l’analyse de code.

Exemples de pseudo-code

Violation

L’échantillon de pseudo-code suivant illustre le modèle détecté par cette règle. Le type du premier paramètre de XmlSerializer.Deserialize n’est pas XmlReader ou une classe dérivée de celui-ci.

using System.IO;
using System.Xml.Serialization;
...
new XmlSerializer(typeof(TestClass).Deserialize(new FileStream("filename", FileMode.Open));

Solution

using System.IO;
using System.Xml;
using System.Xml.Serialization;
...
new XmlSerializer(typeof(TestClass)).Deserialize(XmlReader.Create (new FileStream("filename", FileMode.Open)));