CA2133: Los delegados deben enlazarse a métodos con una transparencia coherente

Elemento Valor
RuleId CA2133
Category Microsoft.Security
Cambio importante Problemático

Nota

Esta advertencia solo se aplica al código que ejecuta CoreCLR (la versión de CLR específica de las aplicaciones web de Silverlight).

Causa

Esta advertencia se desencadena en un método que enlaza un delegado marcado con SecurityCriticalAttribute a un método que es transparente o que está marcado con SecuritySafeCriticalAttribute. La advertencia también desencadena un método que enlaza un delegado que es transparente o crítico para la seguridad a un método crítico.

Nota

Esta regla está en desuso. Para más información, consulte Reglas en desuso.

Descripción de la regla

Los tipos delegados y los métodos a los que se enlazan deben tener una transparencia coherente. Los delegados transparentes y críticos para la seguridad solo se pueden enlazar a otros métodos transparentes o críticos para la seguridad. De forma similar, los delegados críticos solo se pueden enlazar a métodos críticos. Estas reglas de enlace garantizan que el único código que puede invocar un método a través de un delegado también podría haber invocado directamente el mismo método. Por ejemplo, las reglas de enlace impiden que el código transparente llame directamente al código crítico a través de un delegado transparente.

Cómo corregir infracciones

Para corregir una infracción de esta advertencia, cambie la transparencia del delegado o del método que enlaza para que la transparencia de los dos sea equivalente.

Cuándo suprimir las advertencias

No suprima las advertencias de esta regla.

Código

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() { }
    }
}