Поделиться через


CA2140: прозрачный код не должен ссылаться на элементы, критичные в плане безопасности

TypeName

TransparentMethodsMustNotReferenceCriticalCode

CheckId

CA2140

Категория

Microsoft.Security

Критическое изменение

Критическое изменение

Причина

Прозрачный метод:

  • обрабатывает критичный в плане безопасности тип исключения безопасности

  • имеет параметр, который помечен как тип, критичный в плане безопасности

  • имеет универсальный параметр с ограничениями, критичными в плане безопасности

  • имеет локальную переменную типа, критичного в плане безопасности

  • ссылается на тип, помеченный как критичный в плане безопасности

  • вызывает метод, помеченный как критичный в плане безопасности

  • ссылается на поле, помеченное как критичное в плане безопасности

  • возвращает тип, помеченный как критичный в плане безопасности

Описание правила

Элемент кода, помеченный атрибутом SecurityCriticalAttribute, является критичным в плане безопасности. Прозрачный метод не может использовать элемент, критический с точки зрения безопасности. Если прозрачный тип пытается использовать тип, критичный в плане безопасности, то вызывается исключение TypeAccessException, MethodAccessException или FieldAccessException.

Устранение нарушений

Чтобы устранить это нарушение, выполните одно из следующих действий.

Отключение предупреждений

Для этого правила отключать вывод предупреждений не следует.

Пример

В следующих примерах прозрачный метод пытается обратиться к критичной в плане безопасности универсальной коллекции, а также к критичным в плане безопасности полю и методу.

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

См. также

Ссылки

SecurityTransparentAttribute

SecurityCriticalAttribute

SecurityTransparentAttribute

SecurityTreatAsSafeAttribute

System.Security