CA2361 : Vérifier que la classe générée automatiquement contenant DataSet.ReadXml() n'est pas utilisée avec des données non fiables

Propriété Value
Identificateur de la règle CA2361
Titre Vérifier que la classe générée automatiquement contenant DataSet.ReadXml() n'est pas utilisée avec des données non fiables
Catégorie Sécurité
Le correctif est cassant ou non cassant Sans rupture
Activé par défaut dans .NET 8 Non

Cause

La méthode DataSet.ReadXml a été appelée ou référencée, et se trouve dans du code généré automatiquement.

Cette règle classifie le code généré automatiquement :

CA2351 est une règle similaire, applicable quand DataSet.ReadXml apparaît dans du code non généré automatiquement.

Description de la règle

Lors de la désérialisation d’un DataSet avec une entrée non approuvée, un attaquant peut créer une entrée malveillante pour effectuer une attaque par déni de service. Il peut y avoir des vulnérabilités inconnues d’exécution de code à distance.

Cette règle est semblable à CA2351, mais pour du code généré automatiquement pour une représentation en mémoire de données dans une application à interface graphique utilisateur. En règle générale, ces classes générées automatiquement ne sont pas désérialisées à partir d’une entrée non approuvée. L’usage par votre application peut varier.

Pour plus d’informations, consultez les conseils de sécurité DataSet et DataTable.

Comment corriger les violations

  • Si possible, utilisez Entity Framework plutôt que DataSet.
  • Rendez les données sérialisées inviolables. Après la sérialisation, signez par chiffrement les données sérialisées. Avant la désérialisation, validez la signature de chiffrement. Protégez la clé de chiffrement contre la divulgation, et concevez un mécanisme de permutation des clés.

Quand supprimer les avertissements

Vous pouvez supprimer sans risque un avertissement de cette règle si :

  • Vous savez que l’entrée est approuvée. Considérez que la limite d’approbation et les flux de données de votre application peuvent changer au fil du temps.
  • Vous avez pris l’une des précautions décrites dans Comment corriger les violations.

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 CA2361
// The code that's violating the rule is on this line.
#pragma warning restore CA2361

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.CA2361.severity = none

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

Exemples de pseudo-code

Violation

namespace ExampleNamespace
{
    /// <summary>
    ///Represents a strongly typed in-memory cache of data.
    ///</summary>
    [global::System.Serializable()]
    [global::System.ComponentModel.DesignerCategoryAttribute("code")]
    [global::System.ComponentModel.ToolboxItem(true)]
    [global::System.Xml.Serialization.XmlSchemaProviderAttribute("GetTypedDataSetSchema")]
    [global::System.Xml.Serialization.XmlRootAttribute("Package")]
    [global::System.ComponentModel.Design.HelpKeywordAttribute("vs.data.DataSet")]
    public partial class Something : global::System.Data.DataSet {

        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
        protected override void ReadXmlSerializable(global::System.Xml.XmlReader reader) {
            if ((this.DetermineSchemaSerializationMode(reader) == global::System.Data.SchemaSerializationMode.IncludeSchema)) {
                this.Reset();
                global::System.Data.DataSet ds = new global::System.Data.DataSet();
                ds.ReadXml(reader);
                if ((ds.Tables["Something"] != null)) {
                    base.Tables.Add(new SomethingTable(ds.Tables["Something"]));
                }
                this.DataSetName = ds.DataSetName;
                this.Prefix = ds.Prefix;
                this.Namespace = ds.Namespace;
                this.Locale = ds.Locale;
                this.CaseSensitive = ds.CaseSensitive;
                this.EnforceConstraints = ds.EnforceConstraints;
                this.Merge(ds, false, global::System.Data.MissingSchemaAction.Add);
                this.InitVars();
            }
            else {
                this.ReadXml(reader);
                this.InitVars();
            }
        }
    }
}

CA2350 : Vérifier que l’entrée de DataTable.ReadXml() est approuvée

CA2351 : Vérifier que l’entrée de DataSet.ReadXml() est approuvée

CA2352 : jeu de données ou table de données non sécurisé(e) dans un type sérialisable peut être vulnérable aux attaques par exécution de code à distance

CA2353 : jeu de données ou table de données non sécurisé(e) dans un type sérialisable

CA2354 : Un jeu de données ou une table de données non sécurisé(e) dans un graphe d’objets désérialisé peut être vulnérable à une attaque par exécution de code à distance

CA2355 : Jeu de données ou table de données non sécurisé(e) dans un graphe d’objets désérialisé

CA2356 : jeu de données ou table de données non sécurisé(e) dans un graphe d’objets désérialisé web

CA2362 : Un jeu de données ou une table de données non sécurisé dans un type sérialisable généré automatiquement peut être vulnérable aux attaques par exécution de code à distance