CA2326: Jangan gunakan nilai TypeNameHandling selain None
Properti | Nilai |
---|---|
ID Aturan | CA2326 |
Judul | Jangan gunakan nilai TypeNameHandling selain Tidak Ada |
Golongan | Keamanan |
Perbaikan bersifat disruptif atau non-disruptif | Non-disruptif |
Diaktifkan secara default di .NET 9 | No |
Penyebab
Aturan ini diaktifkan ketika salah satu kondisi berikut terpenuhi:
- Nilai enumerasi Newtonsoft.Json.TypeNameHandling , selain
None
, dirujuk. - Nilai bilangan bulat yang mewakili nilai bukan nol ditetapkan ke variabel TypeNameHandling .
Deskripsi aturan
Pendeserialisasi yang tidak aman rentan saat mendeserialisasi data yang tidak tepercaya. Penyerang dapat mengubah data yang diserialisasikan untuk memasukkan jenis tidak terduga untuk menyuntikkan objek dengan efek samping yang berbahaya. Serangan terhadap pendeserialisasi yang tidak aman dapat, misalnya, menjalankan perintah pada sistem operasi dasar, berkomunikasi melalui jaringan, atau menghapus file.
Aturan ini menemukan nilai Newtonsoft.Json.TypeNameHandling selain None
. Jika Anda ingin mendeserialisasi hanya ketika Newtonsoft.Json.Serialization.ISerializationBinder ditentukan untuk membatasi jenis yang dideserialisasi, nonaktifkan aturan ini dan aktifkan aturan CA2327, CA2328, CA2329, dan CA2330 sebagai gantinya.
Cara memperbaiki pelanggaran
- Gunakan nilai
None
, jika memungkinkan. - Buat data yang diserialisasi agar tahan rusak. Setelah serialisasi, tanda tangani secara kriptografi data yang diserialisasi. Sebelum deserialisasi, validasi tanda tangan kriptografi. Lindungi kunci kriptografi agar tidak diungkapkan dan didesain untuk rotasi kunci.
- Batasi jenis yang dideserialisasi. Mengimplementasikan Newtonsoft.Json.Serialization.ISerializationBinder kustom. Sebelum deserialisasi dengan Json.NET, pastikan ISerializationBinder kustom Anda ditentukan di properti Newtonsoft.Json.JsonSerializerSettings.SerializationBinder. Dalam metode Newtonsoft.Json.Serialization.ISerializationBinder.BindToType yang diambil alih, jika jenisnya tidak terduga, kembalikan
null
atau tampilkan pengecualian untuk menghentikan deserialisasi.- Jika Anda membatasi jenis deserialisasi, Anda mungkin ingin menonaktifkan aturan ini dan mengaktifkan aturan CA2327, CA2328, CA2329, dan CA2330. Aturan CA2327, CA2328, CA2329, dan CA2330 membantu memastikan bahwa Anda menggunakan ISerializationBinder saat menggunakan nilai TypeNameHandling selain
None
.
- Jika Anda membatasi jenis deserialisasi, Anda mungkin ingin menonaktifkan aturan ini dan mengaktifkan aturan CA2327, CA2328, CA2329, dan CA2330. Aturan CA2327, CA2328, CA2329, dan CA2330 membantu memastikan bahwa Anda menggunakan ISerializationBinder saat menggunakan nilai TypeNameHandling selain
Kapan harus menekan peringatan
Aman untuk menyembunyikan peringatan dari aturan ini jika:
- Anda mengetahui bahwa input-nya tepercaya. Pertimbangkan bahwa batas kepercayaan dan aliran data aplikasi Anda dapat berubah dari waktu ke waktu.
- Anda telah mengambil salah satu tindakan pencegahan dalam Cara memperbaiki pelanggaran.
Menyembunyikan peringatan
Jika Anda hanya ingin menyembunyikan satu pelanggaran, tambahkan arahan praprosedur ke file sumber Anda untuk dinonaktifkan lalu aktifkan kembali aturannya.
#pragma warning disable CA2326
// The code that's violating the rule is on this line.
#pragma warning restore CA2326
Untuk menonaktifkan aturan untuk file, folder, atau proyek, atur tingkat keparahannya ke none
dalam file konfigurasi.
[*.{cs,vb}]
dotnet_diagnostic.CA2326.severity = none
Untuk informasi selengkapnya, lihat Cara menyembunyikan peringatan analisis kode.
Contoh kode semu
Pelanggaran
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
Solusi
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
Aturan terkait
CA2327: Jangan menggunakan JsonSerializerSettings yang tidak aman
CA2328: Pastikan JsonSerializerSettings aman
CA2329: Jangan mendeserialisasi dengan JsonSerializer menggunakan konfigurasi yang tidak aman
CA2330: Pastikan JsonSerializer memiliki konfigurasi yang aman saat mendeserialisasi