CA2322: Kontrollera att JavaScriptSerializer inte initieras med SimpleTypeResolver innan deserialisering
Property | Värde |
---|---|
Regel-ID | CA2322 |
Title | Kontrollera att JavaScriptSerializer inte initieras med SimpleTypeResolver innan deserialisering |
Kategori | Säkerhet |
Korrigeringen är icke-bakåtkompatibel | Icke-icke-bryta |
Aktiverad som standard i .NET 9 | Nej |
Orsak
En System.Web.Script.Serialization.JavaScriptSerializer deserialiseringsmetod anropades eller refererades till och JavaScriptSerializer kan ha initierats med en System.Web.Script.Serialization.SimpleTypeResolver.
Som standard analyserar den här regeln hela kodbasen, men detta kan konfigureras.
Regelbeskrivning
Osäkra deserialiserare är sårbara när deserialisera ej betrodda data. En angripare kan ändra serialiserade data så att de innehåller oväntade typer för att mata in objekt med skadliga biverkningar. En attack mot en osäker deserialiserare kan till exempel köra kommandon på det underliggande operativsystemet, kommunicera via nätverket eller ta bort filer.
Den här regeln hittar System.Web.Script.Serialization.JavaScriptSerializer deserialiseringsmetodanrop eller referenser, när JavaScriptSerializer kan ha initierats med en System.Web.Script.Serialization.SimpleTypeResolver.
Så här åtgärdar du överträdelser
- Kontrollera att JavaScriptTypeResolver objekt inte initieras med en System.Web.Script.Serialization.SimpleTypeResolver.
- Om koden behöver läsa data serialiserade med hjälp av en SimpleTypeResolverbegränsar du deserialiserade typer till en förväntad lista genom att implementera en anpassad JavaScriptTypeResolver.
- Gör serialiserade data manipuleringssäkra. Efter serialiseringen signerar kryptografiskt serialiserade data. Verifiera den kryptografiska signaturen innan deserialiseringen. Skydda den kryptografiska nyckeln från att avslöjas och utformas för nyckelrotationer.
När du ska ignorera varningar
Det är säkert att ignorera en varning från den här regeln om:
- Du vet att indata är betrodda. Tänk på att programmets förtroendegräns och dataflöden kan ändras över tid.
- Du har vidtagit en av försiktighetsåtgärderna i Så här åtgärdar du överträdelser.
Ignorera en varning
Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.
#pragma warning disable CA2322
// The code that's violating the rule is on this line.
#pragma warning restore CA2322
Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none
i konfigurationsfilen.
[*.{cs,vb}]
dotnet_diagnostic.CA2322.severity = none
Mer information finns i Så här utelämnar du kodanalysvarningar.
Konfigurera kod för analys
Använd följande alternativ för att konfigurera vilka delar av kodbasen som regeln ska köras på.
Du kan konfigurera dessa alternativ för bara den här regeln, för alla regler som den gäller för eller för alla regler i den här kategorin (säkerhet) som den gäller för. Mer information finns i Konfigurationsalternativ för kodkvalitetsregel.
Exkludera specifika symboler
Du kan exkludera specifika symboler, till exempel typer och metoder, från analys. Om du till exempel vill ange att regeln inte ska köras på någon kod inom typer med namnet MyType
lägger du till följande nyckel/värde-par i en .editorconfig-fil i projektet:
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType
Tillåtna symbolnamnformat i alternativvärdet (avgränsade med |
):
- Endast symbolnamn (innehåller alla symboler med namnet, oavsett vilken typ eller namnrymd som innehåller).
- Fullständigt kvalificerade namn i symbolens dokumentations-ID-format. Varje symbolnamn kräver ett symboltypprefix, till exempel
M:
för metoder,T:
för typer ochN:
för namnområden. .ctor
för konstruktorer och.cctor
statiska konstruktorer.
Exempel:
Alternativvärde | Sammanfattning |
---|---|
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType |
Matchar alla symboler med namnet MyType . |
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 |
Matchar alla symboler med namnet antingen MyType1 eller MyType2 . |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) |
Matchar en specifik metod MyMethod med den angivna fullständigt kvalificerade signaturen. |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) |
Matchar specifika metoder MyMethod1 och MyMethod2 med respektive fullständigt kvalificerade signaturer. |
Exkludera specifika typer och deras härledda typer
Du kan exkludera specifika typer och deras härledda typer från analys. Om du till exempel vill ange att regeln inte ska köras på några metoder inom typer som heter MyType
och deras härledda typer lägger du till följande nyckel/värde-par i en .editorconfig-fil i projektet:
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType
Tillåtna symbolnamnformat i alternativvärdet (avgränsade med |
):
- Skriv endast namn (innehåller alla typer med namnet, oavsett vilken typ eller namnrymd som innehåller).
- Fullständigt kvalificerade namn i symbolens dokumentations-ID-format, med ett valfritt
T:
prefix.
Exempel:
Alternativvärde | Sammanfattning |
---|---|
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType |
Matchar alla typer med namnet MyType och alla deras härledda typer. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 |
Matchar alla typer med namnet antingen MyType1 eller MyType2 och alla deras härledda typer. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType |
Matchar en specifik typ MyType med ett angivet fullständigt kvalificerat namn och alla dess härledda typer. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 |
Matchar specifika typer MyType1 och MyType2 med respektive fullständigt kvalificerade namn och alla deras härledda typer. |
Exempel på pseudokod
Överträdelse 1
using System.Web.Script.Serialization;
public class ExampleClass
{
public JavaScriptSerializer Serializer { get; set; }
public T Deserialize<T>(string str)
{
return this.Serializer.Deserialize<T>(str);
}
}
Imports System.Web.Script.Serialization
Public Class ExampleClass
Public Property Serializer As JavaScriptSerializer
Public Function Deserialize(Of T)(str As String) As T
Return Me.Serializer.Deserialize(Of T)(str)
End Function
End Class
Lösning 1
using System.Web.Script.Serialization;
public class ExampleClass
{
public T Deserialize<T>(string str)
{
JavaScriptSerializer s = new JavaScriptSerializer();
return s.Deserialize<T>(str);
}
}
Imports System.Web.Script.Serialization
Public Class ExampleClass
Public Function Deserialize(Of T)(str As String) As T
Dim s As JavaScriptSerializer = New JavaScriptSerializer()
Return s.Deserialize(Of T)(str)
End Function
End Class
Överträdelse 2
using System.Web.Script.Serialization;
public class BookRecord
{
public string Title { get; set; }
public string Author { get; set; }
public int PageCount { get; set; }
public AisleLocation Location { get; set; }
}
public class AisleLocation
{
public char Aisle { get; set; }
public byte Shelf { get; set; }
}
public class ExampleClass
{
public JavaScriptSerializer Serializer { get; set; }
public BookRecord DeserializeBookRecord(string s)
{
return this.Serializer.Deserialize<BookRecord>(s);
}
}
Imports System.Web.Script.Serialization
Public Class BookRecord
Public Property Title As String
Public Property Author As String
Public Property Location As AisleLocation
End Class
Public Class AisleLocation
Public Property Aisle As Char
Public Property Shelf As Byte
End Class
Public Class ExampleClass
Public Property Serializer As JavaScriptSerializer
Public Function DeserializeBookRecord(str As String) As BookRecord
Return Me.Serializer.Deserialize(Of BookRecord)(str)
End Function
End Class
Lösning 2
using System;
using System.Web.Script.Serialization;
public class BookRecordTypeResolver : JavaScriptTypeResolver
{
// For compatibility with data serialized with a JavaScriptSerializer initialized with SimpleTypeResolver.
private static readonly SimpleTypeResolver Simple = new SimpleTypeResolver();
public override Type ResolveType(string id)
{
// One way to discover expected types is through testing deserialization
// of **valid** data and logging the types used.
////Console.WriteLine($"ResolveType('{id}')");
if (id == typeof(BookRecord).AssemblyQualifiedName || id == typeof(AisleLocation).AssemblyQualifiedName)
{
return Simple.ResolveType(id);
}
else
{
throw new ArgumentException("Unexpected type ID", nameof(id));
}
}
public override string ResolveTypeId(Type type)
{
return Simple.ResolveTypeId(type);
}
}
public class BookRecord
{
public string Title { get; set; }
public string Author { get; set; }
public int PageCount { get; set; }
public AisleLocation Location { get; set; }
}
public class AisleLocation
{
public char Aisle { get; set; }
public byte Shelf { get; set; }
}
public class ExampleClass
{
public BookRecord DeserializeBookRecord(string s)
{
JavaScriptSerializer serializer = new JavaScriptSerializer(new BookRecordTypeResolver());
return serializer.Deserialize<BookRecord>(s);
}
}
Imports System
Imports System.Web.Script.Serialization
Public Class BookRecordTypeResolver
Inherits JavaScriptTypeResolver
' For compatibility with data serialized with a JavaScriptSerializer initialized with SimpleTypeResolver.
Private Dim Simple As SimpleTypeResolver = New SimpleTypeResolver()
Public Overrides Function ResolveType(id As String) As Type
' One way to discover expected types is through testing deserialization
' of **valid** data and logging the types used.
''Console.WriteLine($"ResolveType('{id}')")
If id = GetType(BookRecord).AssemblyQualifiedName Or id = GetType(AisleLocation).AssemblyQualifiedName Then
Return Simple.ResolveType(id)
Else
Throw New ArgumentException("Unexpected type", NameOf(id))
End If
End Function
Public Overrides Function ResolveTypeId(type As Type) As String
Return Simple.ResolveTypeId(type)
End Function
End Class
Public Class BookRecord
Public Property Title As String
Public Property Author As String
Public Property Location As AisleLocation
End Class
Public Class AisleLocation
Public Property Aisle As Char
Public Property Shelf As Byte
End Class
Public Class ExampleClass
Public Function DeserializeBookRecord(str As String) As BookRecord
Dim serializer As JavaScriptSerializer = New JavaScriptSerializer(New BookRecordTypeResolver())
Return serializer.Deserialize(Of BookRecord)(str)
End Function
End Class
Relaterade regler
CA2321: Deserialisera inte med JavaScriptSerializer med hjälp av en SimpleTypeResolver