Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
| Özellik | Değer |
|---|---|
| Kural Kimliği | CA5362 |
| Başlık | Seri durumdan çıkarılan nesne grafındaki olası başvuru döngüsü |
| Kategori | Güvenlik |
| Düzeltme bozucu ya da bozmayan olabilir | Kesintisiz |
| .NET 10'da varsayılan olarak etkin | Hayır |
| Geçerli diller | C# ve Visual Basic |
Neden
System.SerializableAttribute ile işaretlenmiş bir sınıfın içeren nesneye doğrudan veya dolaylı olarak başvurabilen bir alanı veya özelliği vardır ve bu, olası bir başvuru döngüsüne izin verir.
Kural açıklaması
Güvenilmeyen verilerin seri durumdan çıkarılması durumunda, seri durumdan çıkarılmış nesne grafını işleyen herhangi bir kodun sonsuz döngülere girmeden başvuru döngülerini işlemesi gerekir. Bu hem seri durumdan çıkarma geri çağırmasının parçası olan kodu hem de seri durumdan çıkarma tamamlandıktan sonra nesne grafını işleyen kodu içerir. Aksi takdirde, bir saldırgan başvuru döngüsü içeren kötü amaçlı verilerle Hizmet Reddi saldırısı gerçekleştirebilir.
Bu kural mutlaka bir güvenlik açığı olduğu anlamına gelmez, ancak seri durumdan çıkarılmış nesne grafiklerinde olası başvuru döngülerini işaretlemektedir.
İhlalleri düzeltme
Sınıfı serileştirmeyin ve SerializableAttribute öğesini kaldırın. İsterseniz, kendi kendine referans veren üyeler serileştirilebilir sınıftan çıkarılabilmesi için uygulamanızı yeniden tasarlayabilirsiniz.
Uyarıların ne zaman bastırılması gerekiyor?
Aşağıdakiler durumunda bu kuraldan gelen bir uyarıyı engellemek güvenlidir:
- Girişin güvenilir olduğunu biliyorsunuz. Uygulamanızın güven sınırının ve veri akışlarının zaman içinde değişebileceğini göz önünde bulundurun.
- Seri durumdan çıkarılmış verileri işleyen tüm kodlar, sonsuz bir döngüye girmeden veya aşırı kaynak kullanmadan başvuru döngülerini algılar ve işler.
Uyarıyı gizleme
Yalnızca tek bir ihlali engellemek istiyorsanız, kuralı devre dışı bırakmak ve sonra yeniden etkinleştirmek için kaynak dosyanıza ön işlemci yönergeleri ekleyin.
#pragma warning disable CA5362
// The code that's violating the rule is on this line.
#pragma warning restore CA5362
Bir dosya, klasör veya projenin kuralını devre dışı bırakmak için, yapılandırma dosyasındaki önem derecesini noneolarak ayarlayın.
[*.{cs,vb}]
dotnet_diagnostic.CA5362.severity = none
Daha fazla bilgi için bkz . Kod analizi uyarılarını gizleme.
Sahte kod örnekleri
Olası referans döngüsü ihlali
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;
}
}
}
Çözüm
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;
}
}
}