Megosztás a következőn keresztül:


CA2109: Látható eseménykezelők áttekintése

Tulajdonság Érték
Szabályazonosító CA2109
Cím Látható eseménykezelők áttekintése
Kategória Biztonság
A javítás kompatibilitástörő vagy nem törik Törés
Alapértelmezés szerint engedélyezve a .NET 9-ben Nem

Ok

A rendszer nyilvános vagy védett eseménykezelési módszert észlelt.

Feljegyzés

Ez a szabály elavult. Legutóbb a Microsoft.CodeAnalysis.NetAnalyzers 7.0.0 NuGet csomaggal és a .NET 7 SDK-val szállították.

A szabály azért lett eltávolítva, mert az elemző által figyelmeztetett fenyegetés (egy nem megbízható közvetítő, amely egy kiemelt eseménykezelőt csatlakoztat egy kiemelt eseményindítóhoz) nem létezett a 4.5-ös .NET-keretrendszer óta.

Szabály leírása

Egy külsőleg látható eseménykezelési módszer olyan biztonsági problémát jelent, amely felülvizsgálatot igényel.

Ne tegye közzé az eseménykezelési módszereket, kivéve, ha feltétlenül szükséges. A közzétett metódust meghívó eseménykezelőt, delegálttípust minden eseményhez hozzáadhatja, amíg a kezelő és az eseményaadék megegyezik. Az eseményeket bármilyen kód okozhatja, és gyakran magas megbízhatóságú rendszerkód is generálja a felhasználói műveletekre, például egy gombra való kattintásra válaszul. Ha biztonsági ellenőrzést ad hozzá egy eseménykezelési módszerhez, az nem akadályozza meg, hogy a kód regisztráljon egy eseménykezelőt, amely meghívja a metódust.

Az igény nem képes megbízhatóan megvédeni egy eseménykezelő által meghívott metódust. A biztonsági követelmények a hívásverem hívóinak vizsgálatával segítenek megvédeni a kódokat a nem megbízható hívókkal szemben. Az eseménykezelőt egy eseményhez hozzáadó kód nem feltétlenül jelenik meg a hívásveremen az eseménykezelő metódusainak futtatásakor. Ezért előfordulhat, hogy a hívásverem csak erősen megbízható hívókkal rendelkezik az eseménykezelő metódus meghívásakor. Ez az eseménykezelő metódus által támasztott igények sikerességét eredményezi. Emellett előfordulhat, hogy a kért engedély érvényes lesz a metódus meghívásakor. Ezen okok miatt a szabály megsértésének nem kijavításának kockázata csak az eseménykezelési módszer áttekintése után értékelhető. A kód áttekintésekor vegye figyelembe a következő problémákat:

  • Az eseménykezelő végrehajt minden olyan műveletet, amely veszélyes vagy kihasználható, például engedélyeket igényel vagy letiltja a nem felügyelt kódengedélyeket?

  • Mik a kód biztonsági fenyegetései, mert bármikor futtatható csak megbízható hívókkal a veremen?

Szabálysértések kijavítása

A szabály megsértésének kijavításához tekintse át a metódust, és értékelje ki a következőket:

  • Nem nyilvánossá teheti az eseménykezelési módszert?

  • Ki tudja helyezni az összes veszélyes funkciót az eseménykezelőből?

  • Ha biztonsági igény van előállítva, ez valamilyen más módon is megvalósítható?

Mikor kell letiltani a figyelmeztetéseket?

A szabály figyelmeztetését csak gondos biztonsági felülvizsgálat után tiltsa le, hogy a kód ne jelentsen biztonsági fenyegetést.

Figyelmeztetés mellőzése

Ha csak egyetlen szabálysértést szeretne letiltani, adjon hozzá előfeldolgozási irányelveket a forrásfájlhoz a szabály letiltásához és újbóli engedélyezéséhez.

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

Ha le szeretné tiltani egy fájl, mappa vagy projekt szabályát, állítsa annak súlyosságát none a konfigurációs fájlban.

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

További információ: Kódelemzési figyelmeztetések letiltása.

Példa

Az alábbi kód egy olyan eseménykezelési módszert mutat be, amely rosszindulatú kóddal visszaélhet.

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

Lásd még