CA5362: Potenciální referenční cyklus v deserializovaném grafu objektů

Vlastnost Hodnota
ID pravidla CA5362
Název Potenciální cyklus odkazů v deserializovaném grafu objektů
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

Třída označená System.SerializableAttribute pomocí pole nebo vlastnosti může odkazovat přímo nebo nepřímo na objekt obsahující, což umožňuje potenciální referenční cyklus.

Popis pravidla

Pokud deserializace nedůvěryhodných dat, jakýkoli kód zpracovávající deserializovaný objektový graf musí zpracovávat referenční cykly bez nutnosti přecházet do nekonečných smyček. To zahrnuje jak kód, který je součástí zpětného volání deserializace, tak kód, který zpracovává graf objektu po dokončení deserializace. Jinak by útočník mohl provést útok do služby se zlými daty obsahujícími referenční cyklus.

Toto pravidlo nemusí nutně znamenat ohrožení zabezpečení, ale pouze označí potenciální referenční cykly v deserializovaných grafech objektů.

Jak opravit porušení

Ne serializovat třídu a odebrat SerializableAttribute. Nebo přepracujte aplikaci tak, aby se členové, které odkazují na sebe, mohly být odebrány ze serializovatelné třídy.

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.
  • Veškerý kód zpracovávající deserializovaná data detekuje a zpracovává referenční cykly bez nutnosti přejít do nekonečné smyčky nebo používat nadměrné prostředky.

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 CA5362
// The code that's violating the rule is on this line.
#pragma warning restore CA5362

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.CA5362.severity = none

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

Příklady pseudokódu

Potenciální porušení referenčního cyklu

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;
        }
    }
}

Řešení

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;
        }
    }
}