CA5362: Siklus referensi potensial dalam grafik objek yang dideserialisasi
Properti | Nilai |
---|---|
ID Aturan | CA5362 |
Judul | Siklus referensi potensial dalam grafik objek yang dideserialisasi |
Golongan | Keamanan |
Perbaikan bersifat disruptif atau non-disruptif | Non-disruptif |
Diaktifkan secara default di .NET 9 | No |
Penyebab
Kelas yang ditandai dengan System.SerializableAttribute memiliki bidang atau properti dapat merujuk ke objek yang berisi secara langsung atau tidak langsung, memungkinkan siklus referensi potensial.
Deskripsi aturan
Jika mendeserialisasi data yang tidak tepercaya, maka kode apa pun yang memproses grafik objek yang dideserialisasi perlu menangani siklus referensi tanpa masuk ke perulangan tanpa batas. Ini mencakup kode yang merupakan bagian dari panggilan balik deserialisasi dan kode yang memproses grafik objek setelah deserialisasi selesai. Jika tidak, penyerang dapat melakukan Penolakan serangan Layanan dengan data berbahaya yang berisi siklus referensi.
Aturan ini tidak selalu berarti ada kerentanan, tetapi hanya menandai siklus referensi potensial dalam grafik objek yang dideserialisasi.
Cara memperbaiki pelanggaran
Jangan membuat serial kelas dan menghapus SerializableAttribute. Atau, desain ulang aplikasi Anda sehingga anggota yang dirujuk sendiri dapat dihapus dari kelas yang dapat diserialisasikan.
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.
- Semua kode yang memproses data yang dideserialisasi mendeteksi dan menangani siklus referensi tanpa masuk ke perulangan tak terbatas atau menggunakan sumber daya yang berlebihan.
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 CA5362
// The code that's violating the rule is on this line.
#pragma warning restore CA5362
Untuk menonaktifkan aturan untuk file, folder, atau proyek, atur tingkat keparahannya ke none
dalam file konfigurasi.
[*.{cs,vb}]
dotnet_diagnostic.CA5362.severity = none
Untuk informasi selengkapnya, lihat Cara menyembunyikan peringatan analisis kode.
Contoh kode semu
Potensi pelanggaran siklus referensi
using System;
[Serializable()]
class ExampleClass
{
public ExampleClass ExampleProperty {get; set;}
public int NormalProperty {get; set;}
}
class AnotherClass
{
// The argument passed by could be `JsonConvert.DeserializeObject<ExampleClass>(untrustedData)`.
public void AnotherMethod(ExampleClass ec)
{
while(ec != null)
{
Console.WriteLine(ec.ToString());
ec = ec.ExampleProperty;
}
}
}
Solusi
using System;
[Serializable()]
class ExampleClass
{
[NonSerialized]
public ExampleClass ExampleProperty {get; set;}
public int NormalProperty {get; set;}
}
class AnotherClass
{
// The argument passed by could be `JsonConvert.DeserializeObject<ExampleClass>(untrustedData)`.
public void AnotherMethod(ExampleClass ec)
{
while(ec != null)
{
Console.WriteLine(ec.ToString());
ec = ec.ExampleProperty;
}
}
}