CA2361: Ervoor zorgen dat automatisch gegenereerde klasse met DataSet.ReadXml() niet wordt gebruikt met niet-vertrouwde gegevens

Eigenschap Waarde
Regel-id CA2361
Titel Zorg ervoor dat automatisch gegenereerde klasse met DataSet.ReadXml() niet wordt gebruikt met niet-vertrouwde gegevens
Categorie Beveiliging
Fix kan brekend of niet-brekend zijn Niet-brekend
Standaard ingeschakeld in .NET 10 Nee
Toepasselijke talen C# en Visual Basic

Oorzaak

De DataSet.ReadXml methode is aangeroepen of waarnaar wordt verwezen en bevindt zich binnen automatisch gegenereerde code.

Deze regel classificeert automatisch gegenereerde code b:

CA2351 is een vergelijkbare regel voor wanneer DataSet.ReadXml in niet-automatisch gegenereerde code verschijnt.

Beschrijving van regel

Bij het deserialiseren van een DataSet met niet-vertrouwde invoer kan een aanvaller schadelijke invoer maken om een Denial of Service-aanval uit te voeren. Er zijn mogelijk onbekende beveiligingsproblemen met het uitvoeren van externe code.

Deze regel is net als CA2351, maar voor automatisch gegenereerde code voor een in-memory weergave van gegevens in een GUI-toepassing. Deze automatisch gegenereerde klassen worden meestal niet gedeserialiseerd van niet-vertrouwde invoer. Het gebruik van uw toepassing kan variëren.

Zie de beveiligingsrichtlijnen voor DataSet en DataTable voor meer informatie.

Hoe schendingen op te lossen

  • Gebruik, indien mogelijk, Entity Framework in plaats van de DataSet.
  • Maak de geserialiseerde gegevens manipulatiebestendig. Na serialisatie tekent u de geserialiseerde gegevens cryptografisch. Valideer de cryptografische handtekening voordat deserialisatie plaatsvindt. Beveilig de cryptografische sleutel tegen openbaarmaking en ontwerp voor sleutelrotaties.

Wanneer waarschuwingen onderdrukken

Het is veilig om een waarschuwing van deze regel te onderdrukken als:

  • U weet dat de invoer betrouwbaar is. Houd er rekening mee dat de vertrouwensgrens en gegevensstromen van uw toepassing na verloop van tijd kunnen veranderen.
  • U hebt een van de voorzorgsmaatregelen genomen in Het oplossen van schendingen.

Een waarschuwing onderdrukken

Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de regel uit te schakelen en vervolgens opnieuw in te schakelen.

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

Als u de regel voor een bestand, map of project wilt uitschakelen, stelt u de ernst none ervan in op het configuratiebestand.

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

Zie voor meer informatie Hoe codeanalysewaarschuwingen te onderdrukken.

Voorbeelden van pseudocode

Schending

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: Zorg ervoor dat de invoer van DataTable.ReadXml() wordt vertrouwd

CA2351: Zorg ervoor dat de invoer van DataSet.ReadXml() betrouwbaar is

CA2352: Onveilige gegevensset of gegevenstabel in serializeerbaar type kan kwetsbaar zijn voor aanvallen op uitvoering van externe code

CA2353: Onveilige gegevensset of gegevenstabel in serialiseerbare type

CA2354: Onveilige gegevensset of gegevenstabel in de gedeserialiseerde objecthiërarchie kan kwetsbaar zijn voor uitvoering van externe code-aanvallen

CA2355: Onveilige gegevensset of gegevenstabel in de grafiek met gedeserialiseerde objecten

CA2356: Onveilige gegevensset of gegevenstabel in grafiek met webdeserialized objecten

CA2362: Onveilige gegevensset of gegevenstabel in automatisch gegenereerd serializeerbaar type kan kwetsbaar zijn voor aanvallen op uitvoering van externe code