Share via


CA5362: Lehetséges referenciaciklus deszerializált objektumgráfban

Tulajdonság Érték
Szabályazonosító CA5362
Cím Lehetséges referenciaciklus deszerializált objektumgráfban
Kategória Biztonság
A javítás kompatibilitástörő vagy nem törik Nem törés
Alapértelmezés szerint engedélyezve a .NET 8-ban Nem

Ok

A mezővel vagy tulajdonsággal System.SerializableAttribute megjelölt osztály közvetlenül vagy közvetve hivatkozhat a tartalmazó objektumra, ami potenciális hivatkozási ciklust tesz lehetővé.

Szabály leírása

Ha nem megbízható adatokat deszerializál, akkor a deszerializált objektumgráfot feldolgozó kódnak végtelen ciklusok nélkül kell kezelnie a referenciaciklusokat. Ez magában foglalja mind a deszerializálási visszahívás részét képező kódot, mind az objektumgráfot a deszerializálás befejezése után feldolgozó kódot. Ellenkező esetben a támadó szolgáltatásmegtagadásos támadást hajthat végre hivatkozási ciklust tartalmazó rosszindulatú adatokkal.

Ez a szabály nem feltétlenül jelenti azt, hogy biztonsági rés van, de csak a deszerializált objektumdiagramok lehetséges referenciaciklusait jelöli meg.

Szabálysértések kijavítása

Ne szerializálja az osztályt, és távolítsa el a SerializableAttribute. Vagy újratervezheti az alkalmazást, hogy az önként hivatkozott tagok eltávolíthatók legyenek a szerializálható osztályból.

Mikor kell letiltani a figyelmeztetéseket?

A szabály figyelmeztetését nyugodtan letilthatja, ha:

  • Tudja, hogy a bemenet megbízható. Vegye figyelembe, hogy az alkalmazás megbízhatósági határa és az adatfolyamok idővel változhatnak.
  • A deszerializált adatokat feldolgozó összes kód észleli és kezeli a referenciaciklusokat anélkül, hogy végtelen ciklusba lép, vagy túlzott erőforrásokat használ.

Figyelmeztetés mellőzése

Ha csak egyetlen szabálysértést szeretne letiltani, adjon hozzá előfeldolgozási irányelveket a forrásfájlhoz a szabály letiltásához és újbóli engedélyezéséhez.

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

Ha le szeretné tiltani egy fájl, mappa vagy projekt szabályát, állítsa annak súlyosságát none a konfigurációs fájlban.

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

További információ: Kódelemzési figyelmeztetések letiltása.

Példák pszeudokódokra

Hivatkozási ciklus lehetséges megsértése

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

Megoldás

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