Share via


CA2109: Granska synliga händelsehanterare

Property Värde
Regel-ID CA2109
Rubrik Granska synliga händelsehanterare
Kategori Säkerhet
Korrigeringen är icke-bakåtkompatibel Bryta
Aktiverad som standard i .NET 8 Nej

Orsak

En offentlig eller skyddad händelsehanteringsmetod har identifierats.

Kommentar

Den här regeln är inaktuell. Det levererades senast med Microsoft.CodeAnalysis.NetAnalyzers 7.0.0 NuGet-paketet och .NET 7 SDK.

Regeln togs bort eftersom hotet som analysatorn varnade för (en ej betrodd mellanhand som kopplar en privilegierad händelsehanterare till en privilegierad händelseanropare) inte har funnits sedan .NET Framework 4.5.

Regelbeskrivning

En externt synlig händelsehanteringsmetod visar ett säkerhetsproblem som kräver granskning.

Exponera inte metoder för händelsehantering om det inte är absolut nödvändigt. En händelsehanterare, en ombudstyp, som anropar den exponerade metoden kan läggas till i valfri händelse så länge hanteraren och händelsesignaturerna matchar. Händelser kan potentiellt genereras av valfri kod och genereras ofta av mycket betrodd systemkod som svar på användaråtgärder som att klicka på en knapp. Att lägga till en säkerhetskontroll i en händelsehanteringsmetod hindrar inte kod från att registrera en händelsehanterare som anropar metoden.

Ett krav kan inte på ett tillförlitligt sätt skydda en metod som anropas av en händelsehanterare. Säkerhetskrav hjälper till att skydda kod från ej betrodda uppringare genom att undersöka anroparna i samtalsstacken. Kod som lägger till en händelsehanterare i en händelse finns inte nödvändigtvis i anropsstacken när händelsehanterarens metoder körs. Därför kan anropsstacken bara ha högt betrodda anropare när händelsehanterarmetoden anropas. Detta gör att krav som ställs av händelsehanterarmetoden lyckas. Dessutom kan den begärda behörigheten hävdas när metoden anropas. Av dessa skäl kan risken för att inte åtgärda en överträdelse av den här regeln endast bedömas efter att ha granskat metoden för händelsehantering. När du granskar koden bör du tänka på följande problem:

  • Utför händelsehanteraren några åtgärder som är farliga eller exploaterbara, till exempel att hävda behörigheter eller förhindra ohanterad kodbehörighet?

  • Vilka är säkerhetshoten mot och från koden eftersom den kan köras när som helst med endast högt betrodda anropare i stacken?

Så här åtgärdar du överträdelser

Om du vill åtgärda ett brott mot den här regeln granskar du metoden och utvärderar följande:

  • Kan du göra händelsehanteringsmetoden icke-offentlig?

  • Kan du flytta alla farliga funktioner från händelsehanteraren?

  • Kan detta åstadkommas på något annat sätt om en säkerhetsefterfrågan införs?

När du ska ignorera varningar

Ignorera en varning från den här regeln först efter en noggrann säkerhetsgranskning för att se till att koden inte utgör ett säkerhetshot.

Ignorera en varning

Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.

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

Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none i konfigurationsfilen.

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

Mer information finns i Så här utelämnar du kodanalysvarningar.

Exempel

Följande kod visar en metod för händelsehantering som kan missbrukas av skadlig 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.");
    }
}

Se även