CA5362: Potentiell referenscykel i deserialiserat objektdiagram
Property | Värde |
---|---|
Regel-ID | CA5362 |
Title | Potentiell referenscykel i deserialiserat objektdiagram |
Kategori | Säkerhet |
Korrigeringen är icke-bakåtkompatibel | Icke-icke-bryta |
Aktiverad som standard i .NET 9 | Nej |
Orsak
En klass som är markerad med System.SerializableAttribute har ett fält eller en egenskap kan referera till det innehållande objektet direkt eller indirekt, vilket möjliggör en potentiell referenscykel.
Regelbeskrivning
Om deserialisera ej betrodda data måste all kod som bearbetar det deserialiserade objektdiagrammet hantera referenscykler utan att gå in i oändliga loopar. Detta inkluderar både kod som ingår i ett återanrop till deserialisering och kod som bearbetar objektdiagrammet när deserialiseringen har slutförts. Annars kan en angripare utföra en Överbelastningsattack med skadliga data som innehåller en referenscykel.
Den här regeln betyder inte nödvändigtvis att det finns en säkerhetsrisk, utan bara flaggar potentiella referenscykler i deserialiserade objektdiagram.
Så här åtgärdar du överträdelser
Serialisera inte klassen och ta bort SerializableAttribute. Du kan också göra om programmet så att de självuppgivna medlemmarna kan tas bort från den serialiserbara klassen.
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.
- All kodbearbetning av deserialiserade data identifierar och hanterar referenscykler utan att gå in i en oändlig loop eller använda överdrivna resurser.
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 CA5362
// The code that's violating the rule is on this line.
#pragma warning restore CA5362
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.CA5362.severity = none
Mer information finns i Så här utelämnar du kodanalysvarningar.
Exempel på pseudokod
Potentiell referenscykelöverträdelse
using System;
[Serializable()]
class ExampleClass
{
public ExampleClass ExampleProperty {get; set;}
public int NormalProperty {get; set;}
}
class AnotherClass
{
// The argument passed by could be `JsonConvert.DeserializeObject<ExampleClass>(untrustedData)`.
public void AnotherMethod(ExampleClass ec)
{
while(ec != null)
{
Console.WriteLine(ec.ToString());
ec = ec.ExampleProperty;
}
}
}
Lösning
using System;
[Serializable()]
class ExampleClass
{
[NonSerialized]
public ExampleClass ExampleProperty {get; set;}
public int NormalProperty {get; set;}
}
class AnotherClass
{
// The argument passed by could be `JsonConvert.DeserializeObject<ExampleClass>(untrustedData)`.
public void AnotherMethod(ExampleClass ec)
{
while(ec != null)
{
Console.WriteLine(ec.ToString());
ec = ec.ExampleProperty;
}
}
}