CA2109: Controllare i gestori di eventi visibili

Proprietà valore
ID regola CA2109
Title Controllare i gestori di eventi visibili
Categoria Sicurezza
La correzione causa un'interruzione o meno Interruzione
Abilitato per impostazione predefinita in .NET 9 No

Causa

È stato rilevato un metodo di gestione eventi pubblico o protetto.

Nota

Questa regola è stata deprecata. L'ultima versione è stata fornita con il pacchetto NuGet Microsoft.CodeAnalysis.NetAnalyzers 7.0.0 e .NET 7 SDK.

La regola è stata rimossa perché la minaccia che l'analizzatore ha avvisato (un intermediario non attendibile che associa un gestore eventi con privilegi a un invoker di eventi con privilegi) non esiste da .NET Framework 4.5.

Descrizione regola

Un metodo di gestione degli eventi visibile esternamente presenta un problema di sicurezza che richiede una revisione.

Non esporre metodi di gestione degli eventi a meno che non sia assolutamente necessario. Un gestore eventi, un tipo delegato, che richiama il metodo esposto può essere aggiunto a qualsiasi evento, purché il gestore e le firme degli eventi corrispondano. Gli eventi possono essere potenzialmente generati da qualsiasi codice e spesso vengono generati da codice di sistema altamente attendibile in risposta alle azioni dell'utente, ad esempio facendo clic su un pulsante. L'aggiunta di un controllo di sicurezza a un metodo di gestione degli eventi non impedisce al codice di registrare un gestore eventi che richiama il metodo .

Una richiesta non può proteggere in modo affidabile un metodo richiamato da un gestore eventi. Le richieste di sicurezza consentono di proteggere il codice dai chiamanti non attendibili esaminando i chiamanti nello stack di chiamate. Il codice che aggiunge un gestore eventi a un evento non è necessariamente presente nello stack di chiamate quando vengono eseguiti i metodi del gestore eventi. Di conseguenza, lo stack di chiamate potrebbe avere solo chiamanti altamente attendibili quando viene richiamato il metodo del gestore eventi. In questo modo, le richieste effettuate dal metodo del gestore eventi hanno esito positivo. Inoltre, l'autorizzazione richiesta potrebbe essere asserta quando viene richiamato il metodo. Per questi motivi, il rischio di non correggere una violazione di questa regola può essere valutato solo dopo aver esaminato il metodo di gestione degli eventi. Quando si esamina il codice, considerare i problemi seguenti:

  • Il gestore eventi esegue operazioni pericolose o sfruttabili, ad esempio l'asserzione di autorizzazioni o l'eliminazione dell'autorizzazione del codice non gestito?

  • Quali sono le minacce alla sicurezza da e verso il codice perché possono essere eseguite in qualsiasi momento con solo chiamanti altamente attendibili nello stack?

Come correggere le violazioni

Per correggere una violazione di questa regola, esaminare il metodo e valutare quanto segue:

  • È possibile rendere il metodo di gestione degli eventi non pubblico?

  • È possibile spostare tutte le funzionalità pericolose dal gestore eventi?

  • Se viene imposta una domanda di sicurezza, questa operazione può essere eseguita in qualche altro modo?

Quando eliminare gli avvisi

Eliminare un avviso da questa regola solo dopo un'attenta verifica della sicurezza per assicurarsi che il codice non rappresenti una minaccia per la sicurezza.

Eliminare un avviso

Se si vuole eliminare una singola violazione, aggiungere direttive del preprocessore al file di origine per disabilitare e quindi riabilitare la regola.

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

Per disabilitare la regola per un file, una cartella o un progetto, impostarne la gravità none su nel file di configurazione.

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

Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.

Esempio

Il codice seguente illustra un metodo di gestione degli eventi che può essere usato in modo improprio da codice dannoso.

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

Vedi anche