CA2109 : Passez en revue les gestionnaires d’événements visiblesCA2109: Review visible event handlers

TypeNameTypeName ReviewVisibleEventHandlersReviewVisibleEventHandlers
CheckIdCheckId CA2109CA2109
CategoryCategory Microsoft.SecurityMicrosoft.Security
Modification avec ruptureBreaking Change RuptureBreaking

CauseCause

Une méthode de gestion d’événements publique ou protégée a été détectée.A public or protected event-handling method was detected.

Description de la règleRule description

Une méthode visible de l’extérieur de la gestion des événements présente un problème de sécurité qui requiert une révision.An externally visible event-handling method presents a security issue that requires review.

N’exposez pas les méthodes de gestion des événements, sauf si cela est absolument nécessaire.Do not expose event-handling methods unless absolutely necessary. Un gestionnaire d’événements, un type délégué, qui appelle la méthode exposée peut être ajouté à n’importe quel événement, à condition que le gestionnaire et événements les signatures correspondent.An event handler, a delegate type, that invokes the exposed method can be added to any event as long as the handler and event signatures match. Événements peuvent potentiellement être déclenchés par n’importe quel code et sont souvent déclenchés par le code système hautement fiable en réponse aux actions utilisateur comme un clic sur un bouton.Events can potentially be raised by any code, and are frequently raised by highly trusted system code in response to user actions such as clicking a button. Ajout d’une vérification de sécurité à une méthode de gestion d’événements n’empêche pas de code à partir de l’inscription d’un gestionnaire d’événements qui appelle la méthode.Adding a security check to an event-handling method does not prevent code from registering an event handler that invokes the method.

Une demande ne peut pas protéger de manière fiable une méthode appelée par un gestionnaire d’événements.A demand cannot reliably protect a method invoked by an event handler. Demandes de sécurité contribuent protéger le code contre les appelants non fiables en examinant les appelants sur la pile des appels.Security demands help protect code from untrusted callers by examining the callers on the call stack. Code qui ajoute un gestionnaire d’événements à un événement n’est pas nécessairement présent sur la pile des appels lorsque les méthodes de gestionnaire d’événements sont exécutées.Code that adds an event handler to an event is not necessarily present on the call stack when the event handler's methods run. Par conséquent, la pile des appels peut avoir uniquement hautement approuvé les appelants lorsque la méthode de gestionnaire d’événements est appelée.Therefore, the call stack might have only highly trusted callers when the event handler method is invoked. Cela entraîne des demandes faites par la méthode de gestionnaire d’événements réussisse.This causes demands made by the event handler method to succeed. En outre, l’autorisation demandée peut être déclarée lorsque la méthode est appelée.Also, the demanded permission might be asserted when the method is invoked. Pour ces raisons, le risque de correction d’une violation de cette règle ne peut être évalué après avoir examiné la méthode de gestion des événements.For these reasons, the risk of not fixing a violation of this rule can only be assessed after reviewing the event-handling method. Lorsque vous examinez votre code, considérez les points suivants :When you review your code, consider the following issues:

  • Votre gestionnaire d’événements effectue des opérations dangereuses ou exploitables, telles que la déclaration d’autorisations ou la suppression des autorisations de code non managé ?Does your event handler perform any operations that are dangerous or exploitable, such as asserting permissions or suppressing unmanaged code permission?

  • Quelles sont les menaces de sécurité vers et à partir de votre code, car il peut s’exécuter à tout moment avec uniquement hautement approuvé les appelants sur la pile ?What are the security threats to and from your code because it can run at any time with only highly trusted callers on the stack?

Comment corriger les violationsHow to fix violations

Pour corriger une violation de cette règle, examinez la méthode et évaluez les éléments suivants :To fix a violation of this rule, review the method and evaluate the following:

  • Vous pouvez rendre la méthode de gestion des événements non publics ?Can you make the event-handling method non-public?

  • Vous pouvez déplacer toutes les fonctionnalités dangereuses hors du Gestionnaire d’événements ?Can you move all dangerous functionality out of the event handler?

  • Si une demande de sécurité est imposée, il est possible d’une autre manière ?If a security demand is imposed, can this be accomplished in some other manner?

Quand supprimer les avertissementsWhen to suppress warnings

Supprimez un avertissement de cette règle uniquement après un examen minutieux de la sécurité pour vous assurer que votre code ne constitue pas une menace de sécurité.Suppress a warning from this rule only after a careful security review to make sure that your code does not pose a security threat.

ExempleExample

Le code suivant montre une méthode de gestion d’événements qui permettre être utilisés à mauvais escient par du code malveillant.The following code shows an event-handling method that can be misused by malicious code.

using System;
using System.Security;
using System.Security.Permissions;

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

   }
}

Voir aussiSee also