Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
| Proprietà | valore |
|---|---|
| ID regola | CA5362 |
| Title | Ciclo di riferimento potenziale nel grafico di oggetti deserializzato |
| Categoria | Sicurezza |
| La correzione causa un'interruzione o meno | Non rompente |
| Abilitato per impostazione predefinita in .NET 10 | No |
| Linguaggi applicabili | C# e Visual Basic |
Causa
Una classe contrassegnata con System.SerializableAttribute ha un campo o una proprietà che può fare riferimento all'oggetto contenitore direttamente o indirettamente, consentendo un potenziale ciclo di riferimento.
Descrizione regola
Se deserializzare i dati non attendibili, qualsiasi codice che elabora l'oggetto grafico deserializzato deve gestire i cicli di riferimento senza passare a cicli infiniti. Sono inclusi sia il codice che fa parte di un callback di deserializzazione sia il codice che elabora il grafo di oggetti dopo il completamento della deserializzazione. In caso contrario, un utente malintenzionato potrebbe eseguire un attacco Denial of Service con dati dannosi contenenti un ciclo di riferimento.
Questa regola non significa necessariamente che ci sia una vulnerabilità, ma contrassegna solo i potenziali cicli di riferimento nei grafici di oggetti deserializzati.
Come correggere le violazioni
Non serializzare la classe e rimuovere SerializableAttribute. In alternativa, riprogettare l'applicazione in modo che i membri con riferimento automatico possano essere rimossi dalla classe serializzabile.
Quando eliminare gli avvisi
È possibile eliminare un avviso da questa regola se:
- Sai che l'input è attendibile. Si consideri che i limiti di attendibilità e i flussi di dati dell'applicazione possono cambiare nel tempo.
- Tutto il codice che elabora i dati deserializzati rileva e gestisce i cicli di riferimento senza passare a un ciclo infinito o usando risorse eccessive.
Eliminare un avviso
Se si vuole eliminare una singola violazione, aggiungere direttive del preprocessore al file di origine per disabilitare e quindi riabilitare la regola.
#pragma warning disable CA5362
// The code that's violating the rule is on this line.
#pragma warning restore CA5362
Per disabilitare la regola per un file, una cartella o un progetto, impostarne la gravità none su nel file di configurazione.
[*.{cs,vb}]
dotnet_diagnostic.CA5362.severity = none
Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.
Esempi di pseudo-codice
Potenziale violazione del ciclo di riferimento
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;
}
}
}
Soluzione
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;
}
}
}