Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
| Tulajdonság | Érték |
|---|---|
| Szabályazonosító | CA2322 |
| Cím | Győződjön meg arról, hogy a JavaScriptSerializer nincs inicializálva a SimpleTypeResolverrel a deszerializálás előtt |
| Kategória | Biztonság |
| A javítás romboló vagy nem romboló | Nem törhető |
| Alapértelmezés szerint engedélyezve a .NET 10-ben | Nem |
| Alkalmazandó nyelvek | C# és Visual Basic |
Ok
A System.Web.Script.Serialization.JavaScriptSerializer deszerializálási metódus meghívása vagy hivatkozása megtörtént, és JavaScriptSerializer lehetséges, hogy inicializálva lett egy System.Web.Script.Serialization.SimpleTypeResolver.
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 a deszerializálási metódus hívásait vagy hivatkozásait System.Web.Script.Serialization.JavaScriptSerializer, amikor a JavaScriptSerializer inicializálva lehetett egy System.Web.Script.Serialization.SimpleTypeResolver-vel.
Szabálysértések kijavítása
- Győződjön meg arról, hogy a JavaScriptTypeResolver objektumok nincsenek System.Web.Script.Serialization.SimpleTypeResolver inicializálva.
- Ha a kódnak szerializált adatokat kell olvasnia egy SimpleTypeResolver használatával, korlátozza a deszerializált típusokat egyéni JavaScriptTypeResolver implementálással egy várt listára.
- Tegye a szerializált adatokat manipulációbiztossá. 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 CA2322
// The code that's violating the rule is on this line.
#pragma warning restore CA2322
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.CA2322.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ági), amelyekre vonatkoznak. További információ: Kódminőségi szabály konfigurációs beállításai.
Adott szimbólumok kizárása
A excluded_symbol_names beállítással kizárhat bizonyos szimbólumokat, például típusokat és metódusokat az elemzésből. Ha például meg szeretné adni, hogy a szabály ne fusson a nevesített MyTypetí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
Jegyzet
Cserélje le a XXXXCAXXXX részét a vonatkozó szabály azonosítójára.
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. -
.ctorkonstruktorok és.cctorstatikus 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 MyTypeszimbólummal. |
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 |
Az összes MyType1 vagy MyType2 nevű szimbólummal megegyezik. |
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) |
Összepárosítja az adott metódusokat MyMethod1 és MyMethod2 a megfelelő teljesen minősített aláírásokkal. |
Adott típusok és származtatott típusok kizárása
A excluded_type_names_with_derived_types beállítás beállításával kizárhat bizonyos típusokat és azok származtatott típusait 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
Jegyzet
Cserélje le a XXXXCAXXXX részét a vonatkozó szabály azonosítójára.
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 található teljesen minősített 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 minden olyan típusnak, amelyik vagy a MyType1 vagy a MyType2 nevet viseli, és az összes belőlük származtatott típusnak. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType |
Az adott MyType típust egyezteti 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 |
Az MyType1 és MyType2 konkrét típusokat és azoknak a teljes kvalifikált neveket, valamint az összes származtatott típust egyezteti. |
Példák pszeudokódokra
Szabálysértés 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
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 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
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
CA2321: Ne deszerializáljon JavaScriptSerializerrel, ha SimpleTypeResolver-t használ