Share via


CA5362: Potentiell referenscykel i deserialiserat objektdiagram

Property Värde
Regel-ID CA5362
Rubrik Potentiell referenscykel i deserialiserat objektdiagram
Kategori Säkerhet
Korrigeringen är icke-bakåtkompatibel Icke-icke-bryta
Aktiverad som standard i .NET 8 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;
        }
    }
}