Udostępnij za pośrednictwem


CA2109: Przejrzyj widoczne programy obsługi zdarzeń

Właściwości Wartość
Identyfikator reguły CA2109
Stanowisko Przejrzyj widoczne procedury obsługi zdarzeń
Kategoria Bezpieczeństwo
Poprawka powodująca niezgodność lub niezgodność Kluczowa
Domyślnie włączone na platformie .NET 8 Nie.

Przyczyna

Wykryto publiczną lub chronioną metodę obsługi zdarzeń.

Uwaga

Ta reguła została przestarzała. Ostatnio została ona dostarczona z pakietem NuGet Microsoft.CodeAnalysis.NetAnalyzers 7.0.0 i zestawem SDK platformy .NET 7.

Reguła została usunięta, ponieważ zagrożenie ostrzegane przez analizatora (niezaufany pośrednik podłączając uprzywilejowany program obsługi zdarzeń do uprzywilejowanego wywołania zdarzeń) nie istniał od czasu programu .NET Framework 4.5.

Opis reguły

Zewnętrznie widoczna metoda obsługi zdarzeń stanowi problem z zabezpieczeniami, który wymaga przeglądu.

Nie ujawniaj metod obsługi zdarzeń, chyba że jest to absolutnie konieczne. Procedura obsługi zdarzeń, typ delegata, która wywołuje uwidocznioną metodę, można dodać do dowolnego zdarzenia, o ile program obsługi i sygnatury zdarzeń są zgodne. Zdarzenia mogą być potencjalnie wywoływane przez dowolny kod i są często wywoływane przez wysoce zaufany kod systemu w odpowiedzi na akcje użytkownika, takie jak kliknięcie przycisku. Dodanie sprawdzania zabezpieczeń do metody obsługi zdarzeń nie uniemożliwia zarejestrowania programu obsługi zdarzeń, który wywołuje metodę.

Żądanie nie może niezawodnie chronić metody wywoływanej przez program obsługi zdarzeń. Wymagania dotyczące zabezpieczeń pomagają chronić kod przed niezaufanym obiektami wywołującymi, sprawdzając osoby wywołujące w stosie wywołań. Kod, który dodaje procedurę obsługi zdarzeń do zdarzenia, nie musi znajdować się w stosie wywołań po uruchomieniu metod programu obsługi zdarzeń. W związku z tym stos wywołań może mieć tylko wysoce zaufane wywołania, gdy wywoływana jest metoda obsługi zdarzeń. Powoduje to powodzenie żądań przez metodę obsługi zdarzeń. Ponadto wymagane uprawnienie może być asertywne po wywołaniu metody. Z tych powodów ryzyko naruszenia tej reguły można ocenić tylko po przejrzeniu metody obsługi zdarzeń. Podczas przeglądania kodu należy wziąć pod uwagę następujące problemy:

  • Czy program obsługi zdarzeń wykonuje jakiekolwiek operacje niebezpieczne lub możliwe do wykorzystania, takie jak potwierdzanie uprawnień lub pomijanie niezarządzanych uprawnień kodu?

  • Jakie są zagrożenia bezpieczeństwa do i z kodu, ponieważ można je uruchamiać w dowolnym momencie tylko z wysoce zaufanymi obiektami wywołującymi na stosie?

Jak naprawić naruszenia

Aby naprawić naruszenie tej reguły, przejrzyj metodę i oceń następujące kwestie:

  • Czy można ustawić metodę obsługi zdarzeń jako niepublikową?

  • Czy można przenieść wszystkie niebezpieczne funkcje z programu obsługi zdarzeń?

  • Czy w jakiś inny sposób można osiągnąć w jakiś sposób, jeśli zapotrzebowanie na zabezpieczenia zostanie nałożone?

Kiedy pomijać ostrzeżenia

Pomiń ostrzeżenie z tej reguły dopiero po dokładnym przeglądzie zabezpieczeń, aby upewnić się, że kod nie stanowi zagrożenia bezpieczeństwa.

Pomijanie ostrzeżenia

Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.

#pragma warning disable CA2109
// The code that's violating the rule is on this line.
#pragma warning restore CA2109

Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none w pliku konfiguracji.

[*.{cs,vb}]
dotnet_diagnostic.CA2109.severity = none

Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.

Przykład

Poniższy kod przedstawia metodę obsługi zdarzeń, która może zostać niewłaściwie użyta przez złośliwy kod.

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.");
    }
}

Zobacz też