CA2133 : Les délégués doivent lier les méthodes avec une transparence cohérente

Élément Valeur
ID de la règle CA2133
Category Microsoft.Security
Modification avec rupture Rupture

Notes

Cet avertissement s’applique uniquement au code qui exécute CoreCLR (la version du CLR spécifique aux applications web Silverlight).

Cause

Cet avertissement se déclenche sur une méthode qui lie un délégué marqué à l’aide de SecurityCriticalAttribute à une méthode transparente ou marquée à l’aide de SecuritySafeCriticalAttribute. L’avertissement déclenche également une méthode qui lie un délégué transparent ou critique sécurisé à une méthode critique.

Notes

Cette règle est déconseillée. Pour plus d’informations, consultez Règles dépréciées.

Description de la règle

Les types de délégués et les méthodes auxquelles ils se lient doivent avoir une transparence cohérente. Les délégués transparents et critiques de sécurité ne peuvent se lier qu’à d’autres méthodes transparentes ou critiques sécurisées. De même, les délégués critiques peuvent uniquement se lier à des méthodes critiques. Ces règles de liaison garantissent que le seul code qui peut appeler une méthode via un délégué a également appelé la même méthode directement. Par exemple, les règles de liaison empêchent le code transparent d’appeler du code critique directement via un délégué transparent.

Comment corriger les violations

Pour corriger une violation de cet avertissement, modifiez la transparence du délégué ou de la méthode qu’il lie afin que la transparence des deux soit équivalente.

Quand supprimer les avertissements

Ne supprimez aucun avertissement de cette règle.

Code

using System;
using System.Security;

namespace TransparencyWarningsDemo
{

    public delegate void TransparentDelegate();

    [SecurityCritical]
    public delegate void CriticalDelegate();

    public class TransparentType
    {
        void DelegateBinder()
        {
            // CA2133 violation - binding a transparent delegate to a critical method
            TransparentDelegate td = new TransparentDelegate(CriticalTarget);

            // CA2133 violation - binding a critical delegate to a transparent method
            CriticalDelegate cd = new CriticalDelegate(TransparentTarget);
        }

        [SecurityCritical]
        void CriticalTarget() { }

        void TransparentTarget() { }
    }
}