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;
}
}
}
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: