CA2321: Ne deszerializáljon JavaScriptSerializer használatával SimpleTypeResolver használatával
Tulajdonság | Érték |
---|---|
Szabályazonosító | CA2321 |
Cím | Ne deszerializáljon JavaScriptSerializer használatával SimpleTypeResolver használatával |
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 System.Web.Script.Serialization.JavaScriptSerializer deszerializálási metódus meghívása vagy hivatkozása a deszerializálási módszerrel való inicializálás System.Web.Script.Serialization.SimpleTypeResolverután történt.
Ez a szabály alapértelmezés szerint a teljes kódbázist elemzi, de ez konfigurálható.
Szabály leírása
A nem biztonságos deszerializálók sebezhetők a nem megbízható adatok deszerializálásakor. A támadó úgy módosíthatja a szerializált adatokat, hogy váratlan típusokat is tartalmazzon, hogy kártékony mellékhatásokkal rendelkező objektumokat injektáljon. A nem biztonságos deszerializáló elleni támadás például parancsokat hajthat végre az alapul szolgáló operációs rendszeren, kommunikálhat a hálózaton keresztül, vagy fájlokat törölhet.
Ez a szabály megkeresi System.Web.Script.Serialization.JavaScriptSerializer a deszerializálási metódus hívásait vagy hivatkozásait, miután inicializálta a JavaScriptSerializer metódust egy System.Web.Script.Serialization.SimpleTypeResolver.
Szabálysértések kijavítása
- Ne inicializálja JavaScriptTypeResolver a System.Web.Script.Serialization.SimpleTypeResolver.
- Ha a kódnak szerializált adatokat kell olvasnia egy SimpleTypeResolverhasználatával, egyéni implementálással korlátozza a deszerializált típusokat egy JavaScriptTypeResolvervárt listára.
- Végezze el a szerializált adatok illetéktelen illetéktelen beavatkozását. A szerializálás után kriptográfiailag írja alá a szerializált adatokat. A deszerializálás előtt ellenőrizze a titkosítási aláírást. Védje meg a titkosítási kulcsot a nyilvánosságra hozataltól, és tervezzen kulcsforgatást.
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.
- Megtette a szabálysértések elhárításának egyik óvintézkedését.
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 CA2321
// The code that's violating the rule is on this line.
#pragma warning restore CA2321
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.CA2321.severity = none
További információ: Kódelemzési figyelmeztetések letiltása.
Kód konfigurálása elemzéshez
A következő beállítások segítségével konfigurálhatja, hogy a kódbázis mely részein futtassa ezt a szabályt.
Ezeket a beállításokat konfigurálhatja csak erre a szabályra, az összes szabályra, vagy az ebben a kategóriában szereplő összes szabályra (Biztonság), amelyekre vonatkozik. További információ: Kódminőségi szabály konfigurációs beállításai.
Adott szimbólumok kizárása
Bizonyos szimbólumokat, például típusokat és metódusokat kizárhat az elemzésből. Ha például meg szeretné adni, hogy a szabály ne fusson a nevesített MyType
típusok egyikén sem, adja hozzá a következő kulcs-érték párot a projekt egyik .editorconfig fájljához:
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType
Engedélyezett szimbólumnévformátumok a beállításértékben (a következővel |
elválasztva):
- Csak szimbólumnév (a névvel ellátott összes szimbólumot tartalmazza, függetlenül attól, hogy milyen típusú vagy névtérrel rendelkezik).
- A szimbólum dokumentációazonosító-formátumában szereplő teljes nevek. Minden szimbólumnévhez szimbólum típusú előtag szükséges, például
M:
metódusokhoz,T:
típusokhoz ésN:
névterekhez. .ctor
konstruktorok és.cctor
statikus konstruktorok számára.
Példák:
Beállítás értéke | Összegzés |
---|---|
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType |
Megegyezik az összes elnevezett MyType szimbólummal. |
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 |
Megegyezik az összes elnevezett MyType1 szimbólummal vagy MyType2 . |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) |
Megfelel a megadott metódusnak MyMethod a megadott teljes jogosultsággal rendelkező aláírással. |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) |
Egyezik az adott metódusokkal MyMethod1 és MyMethod2 a megfelelő, teljes mértékben minősített aláírásokkal. |
Adott típusok és származtatott típusok kizárása
Bizonyos típusokat és azok származtatott típusait kizárhatja az elemzésből. Ha például meg szeretné adni, hogy a szabály ne fusson a nevesített MyType
és származtatott típusok egyik metódusán sem, adja hozzá a következő kulcs-érték párot a projekt egyik .editorconfig fájljához:
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType
Engedélyezett szimbólumnévformátumok a beállításértékben (a következővel |
elválasztva):
- Csak típusnév (a névvel rendelkező összes típust tartalmazza, függetlenül attól, hogy milyen típust vagy névteret tartalmaz).
- A szimbólum dokumentációazonosító-formátumában szereplő teljes nevek opcionális
T:
előtaggal.
Példák:
Beállítás értéke | Összegzés |
---|---|
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType |
Megfelel az összes névvel ellátott MyType típusnak és az összes származtatott típusnak. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 |
Megfelel az összes névvel ellátott MyType1 típusnak, vagy MyType2 az összes származtatott típusnak. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType |
Egyezik MyType a megadott teljes névvel és az összes származtatott típusával. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 |
Egyezik az adott típusokkal MyType1 és MyType2 a megfelelő teljes névvel, valamint az összes származtatott típussal. |
Példák pszeudokódokra
Szabálysértés 1
using System.Web.Script.Serialization;
public class ExampleClass
{
public T Deserialize<T>(string str)
{
JavaScriptSerializer s = new JavaScriptSerializer(new SimpleTypeResolver());
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(New SimpleTypeResolver())
Return s.Deserialize(Of T)(str)
End Function
End Class
1\. megoldás
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
2. szabálysértés
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 BookRecord DeserializeBookRecord(string s)
{
JavaScriptSerializer serializer = new JavaScriptSerializer(new SimpleTypeResolver());
return 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 Function DeserializeBookRecord(str As String) As BookRecord
Dim serializer As JavaScriptSerializer = New JavaScriptSerializer(New SimpleTypeResolver())
Return serializer.Deserialize(Of BookRecord)(str)
End Function
End Class
2\. megoldás
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
Kapcsolódó szabályok
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: