CA2109: Zkontrolujte viditelné obslužné rutiny událostí

Vlastnost Hodnota
ID pravidla CA2109
Název Zkontrolujte viditelné zpracování událostí
Kategorie Zabezpečení
Oprava, která může být destruktivní nebo nedestruktivní Přerušující
Povoleno ve výchozím nastavení v .NET 10 Ne
Příslušné jazyky C# a Visual Basic

Příčina

Byla zjištěna veřejná nebo chráněná metoda zpracování událostí.

Poznámka:

Toto pravidlo je zastaralé. Naposledy bylo odesláno s balíčkem NuGet Microsoft.CodeAnalysis.NetAnalyzers 7.0.0 a sadou .NET 7 SDK.

Pravidlo bylo odebráno, protože hrozba, na kterou analyzátor upozornil (nedůvěryhodný zprostředkovatel, který připojí obslužnou rutinu privilegované události k privilegovanému vyvolání události), neexistovala od rozhraní .NET Framework 4.5.

Popis pravidla

Externě viditelná metoda zpracování událostí představuje problém se zabezpečením, který vyžaduje kontrolu.

Nezpřístupňujte metody zpracování událostí, pokud to není nezbytně nutné. Obslužnou rutinu události, delegovaný typ, který zprostředkovává vystavenou metodu, lze přidat k jakékoli události, pokud obslužná rutina a podpisy událostí odpovídají. Události mohou být vyvolány libovolným kódem a často jsou vyvolány vysoce důvěryhodným systémovým kódem v reakci na akce uživatelů, jako je kliknutí na tlačítko. Přidání kontroly zabezpečení do metody zpracování událostí nezabrání kódu v registraci obslužné rutiny události, která vyvolá metodu.

Požadavek nemůže spolehlivě chránit metodu vyvolanou zpracovatelem událostí. Požadavky na zabezpečení pomáhají chránit kód před nedůvěryhodnými volajícími tím, že zkoumají volající na zásobníku volání. Kód, který přidá obslužnou rutinu pro událost, nemusí být nutně přítomen v zásobníku volání, když se spouštějí metody obslužné rutiny. Zásobník volání proto může mít při vyvolání metody obslužné rutiny události pouze vysoce důvěryhodné volající. To způsobí, že požadavky provedené metodou obsluhy události budou úspěšné. Také požadované oprávnění může být uplatněno při vyvolání metody. Z těchto důvodů je možné riziko, že nebudete opravovat porušení tohoto pravidla, posoudit pouze po kontrole metody zpracování událostí. Při kontrole kódu zvažte následující problémy:

  • Provádí obslužná rutina události nějaké operace, které jsou nebezpečné nebo zneužitelné, jako je například uplatnění oprávnění nebo potlačení nespravovaného oprávnění ke kódu?

  • Jaké jsou bezpečnostní hrozby pro váš kód a hrozby, které pocházejí z vašeho kódu, protože může běžet kdykoli, pouze má-li na zásobníku vysoce důvěryhodné volající?

Jak opravit porušení

Pokud chcete opravit porušení tohoto pravidla, zkontrolujte metodu a vyhodnoťte následující:

  • Můžete nastavit, aby metoda zpracování událostí byla neveřejná?

  • Můžete odstranit všechny riskantní funkce z obslužné rutiny události?

  • Pokud je vynucována poptávka po zabezpečení, lze toho dosáhnout nějakým jiným způsobem?

Kdy potlačit upozornění

Potlačit upozornění z tohoto pravidla pouze po pečlivé kontrole zabezpečení, abyste měli jistotu, že váš kód nepředstavuje bezpečnostní hrozbu.

Potlačení upozornění

Pokud chcete pouze potlačit jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, abyste pravidlo zakázali a znovu povolili.

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

Pokud chcete pravidlo pro soubor, složku nebo projekt zakázat, nastavte jeho závažnost v none konfiguračním souboru.

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

Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.

Příklad

Následující kód ukazuje metodu zpracování událostí, kterou může zneužít škodlivý kód.

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

Viz také