Share via


CA2109: Zichtbare gebeurtenis-handlers controleren

Eigenschappen Weergegeven als
Regel-id CA2109
Titel Zichtbare gebeurtenis-handlers controleren
Categorie Beveiliging
Oplossing is brekend of niet-brekend Breken
Standaard ingeschakeld in .NET 8 Nee

Oorzaak

Er is een openbare of beveiligde methode voor gebeurtenisafhandeling gedetecteerd.

Notitie

Deze regel is afgeschaft. Het is voor het laatst geleverd met het NuGet-pakket Microsoft.CodeAnalysis.NetAnalyzers 7.0.0 en de .NET 7 SDK.

De regel is verwijderd omdat de bedreiging die de analyse heeft gewaarschuwd (een niet-vertrouwde tussenliggende tussenpersoon die een bevoegde gebeurtenis-handler koppelt aan een aanroeper voor bevoegde gebeurtenissen) niet bestaat sinds .NET Framework 4.5.

Beschrijving van regel

Een extern zichtbare methode voor gebeurtenisafhandeling biedt een beveiligingsprobleem waarvoor beoordeling is vereist.

Maak geen methoden voor gebeurtenisafhandeling beschikbaar, tenzij dit absoluut noodzakelijk is. Een gebeurtenis-handler, een gemachtigde type, die de beschikbaar gemaakte methode aanroept, kan worden toegevoegd aan elke gebeurtenis zolang de handler en gebeurtenishandtekeningen overeenkomen. Gebeurtenissen kunnen mogelijk worden gegenereerd door elke code en worden vaak gegenereerd door systeemcode die sterk wordt vertrouwd als reactie op gebruikersacties, zoals klikken op een knop. Als u een beveiligingscontrole toevoegt aan een methode voor gebeurtenisafhandeling, voorkomt u niet dat code een gebeurtenis-handler registreert die de methode aanroept.

Een vraag kan een methode die wordt aangeroepen door een gebeurtenis-handler niet betrouwbaar beveiligen. Beveiligingsvereisten helpen code te beschermen tegen niet-vertrouwde bellers door de bellers op de oproepstack te onderzoeken. Code waarmee een gebeurtenis-handler aan een gebeurtenis wordt toegevoegd, is niet noodzakelijkerwijs aanwezig op de aanroepstack wanneer de methoden van de gebeurtenis-handler worden uitgevoerd. Daarom kan de aanroepstack alleen maximaal vertrouwde bellers hebben wanneer de gebeurtenis-handlermethode wordt aangeroepen. Dit zorgt ervoor dat de eisen van de gebeurtenishandlermethode slagen. De vereiste machtiging kan ook worden assertie wanneer de methode wordt aangeroepen. Om deze redenen kan het risico dat een schending van deze regel niet wordt opgelost, alleen worden beoordeeld na het controleren van de methode voor gebeurtenisafhandeling. Houd rekening met de volgende problemen wanneer u uw code bekijkt:

  • Voert uw gebeurtenis-handler bewerkingen uit die gevaarlijk of misbruikbaar zijn, zoals het bevestigen van machtigingen of het onderdrukken van niet-beheerde codemachtigingen?

  • Wat zijn de beveiligingsrisico's van en naar uw code omdat deze op elk gewenst moment kan worden uitgevoerd met alleen maximaal vertrouwde bellers op de stack?

Schendingen oplossen

Als u een schending van deze regel wilt oplossen, controleert u de methode en evalueert u het volgende:

  • Kunt u de methode voor gebeurtenisafhandeling niet openbaar maken?

  • Kunt u alle gevaarlijke functionaliteit uit de gebeurtenis-handler verplaatsen?

  • Als er een beveiligingsvraag wordt opgelegd, kan dit op een andere manier worden bereikt?

Wanneer waarschuwingen onderdrukken

Onderdrukt een waarschuwing van deze regel pas na een zorgvuldige beveiligingsbeoordeling om ervoor te zorgen dat uw code geen beveiligingsrisico vormt.

Een waarschuwing onderdrukken

Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de regel uit te schakelen en vervolgens opnieuw in te schakelen.

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

Als u de regel voor een bestand, map of project wilt uitschakelen, stelt u de ernst none ervan in op het configuratiebestand.

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

Zie Codeanalysewaarschuwingen onderdrukken voor meer informatie.

Voorbeeld

De volgende code toont een methode voor gebeurtenisafhandeling die kan worden misbruikt door schadelijke code.

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

Zie ook