CA2361: Verificare che la classe generata automaticamente contenente DataSet.ReadXml() non venga usata con dati non attendibili

Proprietà valore
ID regola CA2361
Titolo Assicurarsi che la classe generata automaticamente che contiene DataSet.ReadXml() non venga usata con dati non attendibili
Categoria Sicurezza
Correzione che causa un'interruzione o un'interruzione Nessuna interruzione
Abilitato per impostazione predefinita in .NET 8 No

Causa

Il DataSet.ReadXml metodo è stato chiamato o a cui si fa riferimento ed è all'interno del codice generato automaticamente.

Questa regola classifica il codice generato automaticamente b:

CA2351 è una regola simile, per quando DataSet.ReadXml viene visualizzata all'interno di codice non generato automaticamente.

Descrizione regola

Quando si deserializza un oggetto DataSet con input non attendibile, un utente malintenzionato può creare input dannoso per eseguire un attacco Denial of Service. Potrebbero verificarsi vulnerabilità sconosciute per l'esecuzione del codice remoto.

Questa regola è simile a CA2351, ma per il codice generato automaticamente per una rappresentazione in memoria dei dati all'interno di un'applicazione GUI. In genere, queste classi generate automaticamente non vengono deserializzate dall'input non attendibile. L'utilizzo dell'applicazione può variare.

Per altre informazioni, vedere Linee guida per la sicurezza di DataSet e DataTable.

Come correggere le violazioni

  • Se possibile, usare Entity Framework anziché .DataSet
  • Rendere i dati serializzati a prova di manomissione. Dopo la serializzazione, firmare in modo crittografico i dati serializzati. Prima della deserializzazione, convalidare la firma crittografica. Proteggere la chiave crittografica dalla divulgazione e dalla progettazione per le rotazioni delle chiavi.

Quando eliminare gli avvisi

È possibile eliminare un avviso da questa regola se:

  • Si sa che l'input è attendibile. Si consideri che i limiti di attendibilità e i flussi di dati dell'applicazione possono cambiare nel tempo.
  • È stata presa una delle precauzioni riportate in Come correggere le violazioni.

Eliminare un avviso

Se si vuole eliminare una singola violazione, aggiungere direttive del preprocessore al file di origine per disabilitare e quindi riabilitare la regola.

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

Per disabilitare la regola per un file, una cartella o un progetto, impostarne la gravità none su nel file di configurazione.

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

Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.

Esempi di pseudo-codice

Violazione

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: Verificare che l'input di DataTable.ReadXml()sia attendibile

CA2351: Verificare che l'input di DataSet.ReadXml()sia attendibile

CA2352: Unsafe DataSet o DataTable in un tipo serializzabile può essere vulnerabile agli attacchi di esecuzione del codice remoto

CA2353: Unsafe DataSet o DataTable in tipo serializzabile

CA2354: Unsafe DataSet o DataTable nell'oggetto grafico deserializzato può essere vulnerabile all'attacco di esecuzione del codice remoto

CA2355: Unsafe DataSet o DataTable in un oggetto grafico deserializzato

CA2356: Unsafe DataSet o DataTable in web deserialized object graph

CA2362: Unsafe DataSet o DataTable in un tipo serializzabile generato automaticamente può essere vulnerabile agli attacchi di esecuzione del codice remoto