Compartir a través de


CA2140: El código transparente no debe hacer referencia a elementos críticos para la seguridad

Nombre de tipo

TransparentMethodsMustNotReferenceCriticalCode

Identificador de comprobación

CA2140

Categoría

Microsoft.Security

Cambio problemático

Motivo

Un método transparente:

  • controla un tipo de excepción de seguridad crítico para la seguridad

  • tiene un parámetro que está marcado como un tipo crítico para la seguridad

  • tiene un parámetro genérico con restricciones críticas para la seguridad

  • tiene una variable local de un tipo crítico para la seguridad

  • hace referencia a un tipo que está marcado como crítico para la seguridad

  • llama a un método que está marcado como crítico para la seguridad

  • hace referencia a un campo que está marcado como crítico para la seguridad

  • devuelve un tipo que está marcado como crítico para la seguridad

Descripción de la regla

Un elemento de código que se marca con el atributo SecurityCriticalAttribute es crítico para la seguridad.Un método transparente no puede utilizar un elemento crítico para la seguridad.Si un tipo transparente intenta usar un tipo crítico para la seguridad, se genera una TypeAccessException, MethodAccessException o FieldAccessException.

Cómo corregir infracciones

Para corregir una infracción de esta regla, haga algo de lo siguiente:

Cuándo suprimir advertencias

No suprima las advertencias de esta regla.

Ejemplo

En los ejemplos siguientes, un método transparente intenta hacer referencia a una colección genérica crítica para la seguridad, un campo crítico para la seguridad y un método crítico para la seguridad.

using System;
using System.Security;
using System.Collections.Generic;

namespace TransparencyWarningsDemo
{

    [SecurityCritical]
    public class SecurityCriticalClass { }

    public class TransparentMethodsReferenceCriticalCodeClass
    {
        [SecurityCritical]
        private object m_criticalField;

        [SecurityCritical]
        private void CriticalMethod() { }

        public void TransparentMethod()
        {
            // CA2140 violation - transparent method accessing a critical type.  This can be fixed by any of:
            //  1. Make TransparentMethod critical
            //  2. Make TransparentMethod safe critical
            //  3. Make CriticalClass safe critical
            //  4. Make CriticalClass transparent
            List<SecurityCriticalClass> l = new List<SecurityCriticalClass>();

            // CA2140 violation - transparent method accessing a critical field.  This can be fixed by any of:
            //  1. Make TransparentMethod critical
            //  2. Make TransparentMethod safe critical
            //  3. Make m_criticalField safe critical
            //  4. Make m_criticalField transparent
            m_criticalField = l;

            // CA2140 violation - transparent method accessing a critical method.  This can be fixed by any of:
            //  1. Make TransparentMethod critical
            //  2. Make TransparentMethod safe critical
            //  3. Make CriticalMethod safe critical
            //  4. Make CriticalMethod transparent
            CriticalMethod();
        }
    }
}

Vea también

Referencia

SecurityTransparentAttribute

SecurityCriticalAttribute

SecurityTransparentAttribute

SecurityTreatAsSafeAttribute

System.Security