CA2361: Ujistěte se, že se u nedůvěryhodných dat nepoužívá automaticky vygenerovaná třída obsahující DataSet.ReadXml().

Vlastnost Hodnota
ID pravidla CA2361
Název Zajistěte, aby se automaticky vygenerovaná třída obsahující DataSet.ReadXml() nepoužívala s nedůvěryhodnými daty.
Kategorie Zabezpečení
Oprava způsobující chybu nebo chybu způsobující chybu Nenarušující
Povoleno ve výchozím nastavení v .NET 8 No

Příčina

Metoda DataSet.ReadXml byla volána nebo odkazována a je v automaticky generovaném kódu.

Toto pravidlo klasifikuje automaticky vygenerovaný kód b:

CA2351 je podobné pravidlo, pokud DataSet.ReadXml se zobrazí v negenerovaném kódu.

Popis pravidla

Při deserializaci nedůvěryhodného DataSet vstupu může útočník vytvořit škodlivý vstup, který provede útok do služby dos. Může se jednat o neznámá ohrožení zabezpečení vzdáleného spuštění kódu.

Toto pravidlo je jako CA2351, ale pro automaticky vygenerovaný kód pro reprezentaci dat v paměti v aplikaci grafického uživatelského rozhraní. Tyto automaticky generované třídy obvykle nejsou deserializovány z nedůvěryhodného vstupu. Využití vaší aplikace se může lišit.

Další informace naleznete v tématu DataSet a DataTable security guidance.

Jak opravit porušení

  • Pokud je to možné, použijte Entity Framework místo DataSet.
  • Zfalšujte serializovaná data a zfalšujte je. Po serializaci kryptograficky podepisujte serializovaná data. Před deserializací ověřte kryptografický podpis. Chraňte kryptografický klíč před zveřejněním a návrhem obměny klíčů.

Kdy potlačit upozornění

Upozornění z tohoto pravidla je bezpečné potlačit, pokud:

  • Víte, že vstup je důvěryhodný. Vezměte v úvahu, že hranice důvěryhodnosti vaší aplikace a toky dat se můžou v průběhu času měnit.
  • Provedli jste jedno z bezpečnostních opatření v části Jak opravit porušení.

Potlačení upozornění

Pokud chcete pouze potlačit jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, abyste pravidlo zakázali a znovu povolili.

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

Pokud chcete pravidlo pro soubor, složku nebo projekt zakázat, nastavte jeho závažnost v none konfiguračním souboru.

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

Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.

Příklady pseudokódu

Porušení

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: Ujistěte se, že vstup DataTable.ReadXml() je důvěryhodný.

CA2351: Ujistěte se, že vstup DataSet.ReadXml() je důvěryhodný.

CA2352: Nebezpečné datové sady nebo datové tabulky v serializovatelném typu mohou být ohroženy útoky vzdáleného spuštění kódu

CA2353: Nezabezpečená datová sada nebo datová tabulka v serializovatelném typu

CA2354: Nezabezpečená datová sada nebo datová tabulka v deserializovaném grafu objektů může být zranitelná vůči útokům vzdáleného spuštění kódu.

CA2355: Nezabezpečená datová sada nebo datová tabulka v deserializovaném grafu objektu

CA2356: Nezabezpečená datová sada nebo datová tabulka v grafu deserializovaného objektu webu

CA2362: Nebezpečná datová sada nebo datová tabulka v automaticky generovaném serializovatelném typu může být zranitelná vůči útokům vzdáleného spuštění kódu