Udostępnij za pośrednictwem


CA2109: Przejrzyj widoczne procedury obsługi zdarzeń

Właściwości Wartość
Identyfikator reguły CA2109
Tytuł Przejrzyj widoczne procedury obsługi zdarzeń
Kategoria Bezpieczeństwo
Poprawka łamiąca lub nienaruszająca Przełomowe
Domyślnie włączone na platformie .NET 10 Nie.
Zastosowane języki C# i Visual Basic

Przyczyna

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

Uwaga

Ta reguła została przestarzała. Ostatnio dostarczono ją z pakietem NuGet Microsoft.CodeAnalysis.NetAnalyzers 7.0.0 i zestawem SDK .NET 7.

Reguła została usunięta, ponieważ ostrzeżenie analizatora dotyczące nieistniejącego od wersji .NET Framework 4.5 zagrożenia, czyli niezaufanego pośrednika podłączającego uprzywilejowany program obsługi zdarzeń do uprzywilejowanego wywoływacza zdarzeń, nie obowiązuje.

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. Procedurę obsługi zdarzeń, typ delegata, który wywołuje ujawnioną metodę, można dodać do dowolnego zdarzenia, o ile sygnatury procedury obsługi i zdarzenia 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 niezaufanymi wywołującymi, sprawdzając wywołujących 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 zaufanych wywołujących, gdy wywoływana jest metoda obsługi zdarzenia. To powoduje, że żądania wykonywane przez metodę obsługi zdarzeń kończą się sukcesem. Ponadto wymagane uprawnienie może zostać wymuszone w momencie wywołania metody. Z tych powodów ryzyko wynikające z niepoprawienia 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 dotyczące Twojego kodu, ponieważ może być uruchamiany w dowolnym momencie przez wysoce zaufanych wywołujących 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 wymóg bezpieczeństwa można spełnić w inny sposób, jeśli zostanie nałożony?

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ż