CA2326: Keine anderen TypeNameHandling-Werte als None (Keine) verwenden
Eigenschaft | Wert |
---|---|
Regel-ID | CA2326 |
Titel | Keine anderen TypeNameHandling-Werte als None (Keine) verwenden |
Kategorie | Security |
Fix führt oder führt nicht zur Unterbrechung | Nicht unterbrechend |
Standardmäßig in .NET 8 aktiviert | Nein |
Ursache
Diese Regel wird ausgelöst, wenn eine der folgenden Bedingungen zutrifft:
- Wenn auf einen anderen Newtonsoft.Json.TypeNameHandling-Enumerationswert als
None
verwiesen wird - Wenn ein Integerwert ungleich 0 einer TypeNameHandling-Variablen zugewiesen wird
Regelbeschreibung
Unsichere Deserialisierer sind beim Deserialisieren nicht vertrauenswürdiger Daten anfällig. Ein Angreifer könnte den serialisierten Daten unerwartete Datentypen hinzufügen, um Objekte mit schädlichen Auswirkungen einschleusen. Ein Angriff auf einen unsicheren Deserialisierer könnte z. B. Befehle auf dem dahinterliegenden Betriebssystem ausführen, über das Netzwerk kommunizieren oder Dateien löschen.
Diese Regel ermittelt Newtonsoft.Json.TypeNameHandling-Werte ungleich None
. Wenn die Deserialisierung nur erfolgen soll, falls Newtonsoft.Json.Serialization.ISerializationBinder für die Einschränkung deserialisierter Typen festgelegt ist, deaktivieren Sie diese Regeln, und aktivieren Sie stattdessen die Regeln CA2327, CA2328, CA2329 und CA2330.
Behandeln von Verstößen
- Verwenden Sie nach Möglichkeit den
None
-Wert von TypeNameHandling. - Stellen Sie sicher, dass die serialisierten Daten nicht manipuliert werden können. Signieren Sie die serialisierten Daten nach der Serialisierung kryptografisch. Überprüfen Sie vor der Deserialisierung die kryptografische Signatur. Schützen Sie den Kryptografieschlüssel vor der Offenlegung und richten Sie Schlüsselrotationen ein.
- Schränken Sie deserialisierte Typen ein. Implementieren Sie eine benutzerdefinierte Newtonsoft.Json.Serialization.ISerializationBinder-Schnittstelle. Stellen Sie vor der Deserialisierung mit Json.NET sicher, dass Ihre benutzerdefinierte ISerializationBinder-Schnittstelle in der Eigenschaft Newtonsoft.Json.JsonSerializerSettings.SerializationBinder angegeben ist. Geben Sie in der überschriebenen Methode Newtonsoft.Json.Serialization.ISerializationBinder.BindToType bei einem unerwarteten Typ
null
zurück, oder lösen Sie eine Ausnahme aus, um die Deserialisierung anzuhalten.- Wenn Sie die deserialisierten Typen einschränken möchten, sollten Sie diese Regel deaktivieren und stattdessen die Regeln CA2327, CA2328, CA2329 und CA2330 aktivieren. Mit den Regeln CA2327, CA2328, CA2329 und CA2330 wird sichergestellt, dass eine ISerializationBinder-Schnittstelle verwendet wird, wenn andere Werte für das TypeNameHandling als
None
verwendet werden.
- Wenn Sie die deserialisierten Typen einschränken möchten, sollten Sie diese Regel deaktivieren und stattdessen die Regeln CA2327, CA2328, CA2329 und CA2330 aktivieren. Mit den Regeln CA2327, CA2328, CA2329 und CA2330 wird sichergestellt, dass eine ISerializationBinder-Schnittstelle verwendet wird, wenn andere Werte für das TypeNameHandling als
Wann sollten Warnungen unterdrückt werden?
Eine Warnung aus dieser Regel kann sicher unterdrückt werden, wenn Folgendes gilt:
- Sie wissen, dass die Eingabe vertrauenswürdig ist. Berücksichtigen Sie, dass sich die Vertrauensstellungsgrenze und Datenflüsse Ihrer Anwendung im Laufe der Zeit ändern können.
- Sie haben eine der Sicherheitsmaßnahmen unter Behandeln von Verstößen ergriffen.
Unterdrücken einer Warnung
Um nur eine einzelne Verletzung zu unterdrücken, fügen Sie der Quelldatei Präprozessoranweisungen hinzu, um die Regel zu deaktivieren und dann wieder zu aktivieren.
#pragma warning disable CA2326
// The code that's violating the rule is on this line.
#pragma warning restore CA2326
Um die Regel für eine Datei, einen Ordner oder ein Projekt zu deaktivieren, legen Sie den Schweregrad in der Konfigurationsdatei auf none
fest.
[*.{cs,vb}]
dotnet_diagnostic.CA2326.severity = none
Weitere Informationen finden Sie unter Vorgehensweise: Unterdrücken von Codeanalyse-Warnungen.
Pseudocodebeispiele
Verletzung
using Newtonsoft.Json;
public class ExampleClass
{
public JsonSerializerSettings Settings { get; }
public ExampleClass()
{
Settings = new JsonSerializerSettings();
Settings.TypeNameHandling = TypeNameHandling.All; // CA2326 violation.
}
}
Imports Newtonsoft.Json
Public Class ExampleClass
Public ReadOnly Property Settings() As JsonSerializerSettings
Public Sub New()
Settings = New JsonSerializerSettings()
Settings.TypeNameHandling = TypeNameHandling.All ' CA2326 violation.
End Sub
End Class
Lösung
using Newtonsoft.Json;
public class ExampleClass
{
public JsonSerializerSettings Settings { get; }
public ExampleClass()
{
Settings = new JsonSerializerSettings();
// The default value of Settings.TypeNameHandling is TypeNameHandling.None.
}
}
Imports Newtonsoft.Json
Public Class ExampleClass
Public ReadOnly Property Settings() As JsonSerializerSettings
Public Sub New()
Settings = New JsonSerializerSettings()
' The default value of Settings.TypeNameHandling is TypeNameHandling.None.
End Sub
End Class
Ähnliche Regeln
CA2327: Keine unsichere JsonSerializerSettings-Klasse verwenden
CA2328: Sicherstellen, dass JsonSerializerSettings sicher ist
CA2329: Nicht mit JsonSerializer mit unsicherer Konfiguration deserialisieren