CA2361: Se till att den automatiskt genererade klassen som innehåller DataSet.ReadXml() inte används med ej betrodda data
Property | Värde |
---|---|
Regel-ID | CA2361 |
Rubrik | Se till att den autogenererade klassen som innehåller DataSet.ReadXml() inte används med data som inte är betrodda |
Kategori | Säkerhet |
Korrigeringen är icke-bakåtkompatibel | Icke-icke-bryta |
Aktiverad som standard i .NET 8 | Nej |
Orsak
Metoden DataSet.ReadXml anropades eller refererades till och finns i automatiskt genererad kod.
Den här regeln klassificerar automatiskt genererad kod b:
- Att vara i en metod med namnet
ReadXmlSerializable
. - Metoden
ReadXmlSerializable
har en System.Diagnostics.DebuggerNonUserCodeAttribute. - Metoden
ReadXmlSerializable
är inom en typ som har en System.ComponentModel.DesignerCategoryAttribute.
CA2351 är en liknande regel, för när DataSet.ReadXml visas i icke-autogenererad kod.
Regelbeskrivning
När en angripare deserialiserar en DataSet med ej betrodda indata kan den skapa skadliga indata för att utföra en överbelastningsattack. Det kan finnas okända sårbarheter för fjärrkörning av kod.
Den här regeln är som CA2351, men för automatiskt genererad kod för en minnesintern representation av data i ett GUI-program. Vanligtvis de här autogenererade klasserna inte deserialiseras från ej betrodda indata. Programmets användning kan variera.
Mer information finns i Säkerhetsvägledning för DataSet och DataTable.
Så här åtgärdar du överträdelser
- Om möjligt använder du Entity Framework i stället för DataSet.
- Gör serialiserade data manipuleringssäkra. Efter serialiseringen signerar kryptografiskt serialiserade data. Verifiera den kryptografiska signaturen innan deserialiseringen. Skydda den kryptografiska nyckeln från att avslöjas och utformas för nyckelrotationer.
När du ska ignorera varningar
Det är säkert att ignorera en varning från den här regeln om:
- Du vet att indata är betrodda. Tänk på att programmets förtroendegräns och dataflöden kan ändras över tid.
- Du har vidtagit en av försiktighetsåtgärderna i Så här åtgärdar du överträdelser.
Ignorera en varning
Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.
#pragma warning disable CA2361
// The code that's violating the rule is on this line.
#pragma warning restore CA2361
Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none
i konfigurationsfilen.
[*.{cs,vb}]
dotnet_diagnostic.CA2361.severity = none
Mer information finns i Så här utelämnar du kodanalysvarningar.
Exempel på pseudokod
Kränkning
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();
}
}
}
}
Relaterade regler
CA2350: Se till att DataTable.ReadXml()-indata är betrodda
CA2351: Se till att DataSet.ReadXml()-indata är betrodda
CA2353: Osäker datauppsättning eller DataTable i serialiserbar typ
CA2355: Osäker datauppsättning eller datatabell i deserialiserat objektdiagram
CA2356: Osäker datauppsättning eller datatabell i webbdeserialiserat objektdiagram