CA2109: Görünen olay işleyicileri gözden geçirin

Özellik Değer
Kural Kimliği CA2109
Başlık Görünen olay işleyicilerini gözden geçirin
Kategori Güvenlik
Hataya neden olan veya bozulmayan düzeltme Yeni
.NET 8'de varsayılan olarak etkin Hayır

Neden

Ortak veya korunan olay işleme yöntemi algılandı.

Dekont

Bu kural kullanım dışı bırakıldı. En son Microsoft.CodeAnalysis.NetAnalyzers 7.0.0 NuGet paketi ve .NET 7 SDK ile birlikte gönderildi.

Çözümleyicinin uyarıda bulunduğu tehdit (ayrıcalıklı bir olay çağırıcıya ayrıcalıklı bir olay işleyicisi bağlama güvenilmeyen bir aracı) .NET Framework 4.5'ten bu yana mevcut olmadığından kural kaldırıldı.

Kural açıklaması

Dışarıdan görünür bir olay işleme yöntemi, gözden geçirme gerektiren bir güvenlik sorunu sunar.

Kesinlikle gerekli olmadıkça olay işleme yöntemlerini kullanıma sunma. İşleyici ve olay imzaları eşleşip eşleşmediği sürece, kullanıma sunulan yöntemi çağıran bir olay işleyicisi, temsilci türü herhangi bir olaya eklenebilir. Olaylar potansiyel olarak herhangi bir kod tarafından oluşturulabilir ve genellikle bir düğmeye tıklama gibi kullanıcı eylemlerine yanıt olarak yüksek oranda güvenilen sistem kodu tarafından tetiklenir. Olay işleme yöntemine güvenlik denetimi eklemek, kodun yöntemini çağıran bir olay işleyicisini kaydetmesini engellemez.

Talep, bir olay işleyicisi tarafından çağrılan bir yöntemi güvenilir bir şekilde koruyamaz. Güvenlik talepleri, çağrı yığınındaki arayanları inceleyerek kodu güvenilmeyen arayanlardan korumaya yardımcı olur. Olay işleyicisinin yöntemleri çalıştırıldığında bir olaya olay işleyicisi ekleyen kodun çağrı yığınında bulunması şart değildir. Bu nedenle, olay işleyicisi yöntemi çağrıldığında çağrı yığınında yalnızca yüksek oranda güvenilen arayanlar olabilir. Bu, olay işleyici yöntemi tarafından yapılan taleplerin başarılı olmasını neden olur. Ayrıca, yöntem çağrıldığında istenen izin onaylanabilir. Bu nedenlerle, bu kuralın ihlalini düzeltmeme riski yalnızca olay işleme yöntemi gözden geçirildikten sonra değerlendirilebilir. Kodunuzu gözden geçirirken aşağıdaki sorunları göz önünde bulundurun:

  • Olay işleyiciniz, izinleri onaylama veya yönetilmeyen kod iznini gizleme gibi tehlikeli veya kötüye kullanılabilir işlemler gerçekleştiriyor mu?

  • Herhangi bir zamanda yalnızca yığında yalnızca yüksek güvenilir arayanlarla çalışabildiğinden kodunuzla ilgili ve kodunuzdan gelen güvenlik tehditleri nelerdir?

İhlalleri düzeltme

Bu kuralın ihlalini düzeltmek için yöntemini gözden geçirin ve aşağıdakileri değerlendirin:

  • Olay işleme yöntemini genel kullanıma açık hale getiremez misiniz?

  • Tüm tehlikeli işlevleri olay işleyicisinin dışına taşıyabilir misiniz?

  • Bir güvenlik talebi uygulanırsa, bu başka bir şekilde gerçekleştirilebilir mi?

Uyarıların ne zaman bastırılması gerekiyor?

Kodunuzun güvenlik tehdidi oluşturmadığından emin olmak için bu kuraldan gelen uyarıyı yalnızca dikkatli bir güvenlik gözden geçirmesinden sonra gizleyin.

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 CA2109
// The code that's violating the rule is on this line.
#pragma warning restore CA2109

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.CA2109.severity = none

Daha fazla bilgi için bkz . Kod analizi uyarılarını gizleme.

Örnek

Aşağıdaki kod, kötü amaçlı kod tarafından kötüye kullanılabilecek bir olay işleme yöntemini gösterir.

public class HandleEvents
{
    // Due to the access level and signature, a malicious caller could 
    // add this method to system-triggered events where all code in the call
    // stack has the demanded permission.

    // Also, the demand might be canceled by an asserted permission.

    [SecurityPermissionAttribute(SecurityAction.Demand, UnmanagedCode = true)]

    // Violates rule: ReviewVisibleEventHandlers.
    public static void SomeActionHappened(Object sender, EventArgs e)
    {
        Console.WriteLine("Do something dangerous from unmanaged code.");
    }
}

Ayrıca bkz.