CA2140: прозрачный код не должен ссылаться на элементы, критичные в плане безопасности
TypeName |
TransparentMethodsMustNotReferenceCriticalCode |
CheckId |
CA2140 |
Категория |
Microsoft.Security |
Критическое изменение |
Критическое изменение |
Причина
Прозрачный метод:
обрабатывает критичный в плане безопасности тип исключения безопасности
имеет параметр, который помечен как тип, критичный в плане безопасности
имеет универсальный параметр с ограничениями, критичными в плане безопасности
имеет локальную переменную типа, критичного в плане безопасности
ссылается на тип, помеченный как критичный в плане безопасности
вызывает метод, помеченный как критичный в плане безопасности
ссылается на поле, помеченное как критичное в плане безопасности
возвращает тип, помеченный как критичный в плане безопасности
Описание правила
Элемент кода, помеченный атрибутом SecurityCriticalAttribute, является критичным в плане безопасности.Прозрачный метод не может использовать элемент, критический с точки зрения безопасности.Если прозрачный тип пытается использовать тип, критичный в плане безопасности, то вызывается исключение TypeAccessException, MethodAccessException или FieldAccessException.
Устранение нарушений
Чтобы устранить это нарушение, выполните одно из следующих действий.
Пометьте элемент кода, использующий критичный в плане безопасности код с атрибутом SecurityCriticalAttribute
- либо -
Удалите атрибут SecurityCriticalAttribute из элементов кода, помеченных как критичные в плане безопасности, и измените их метку, воспользовавшись атрибутом SecuritySafeCriticalAttribute или SecurityTransparentAttribute.
Отключение предупреждений
Для этого правила отключать вывод предупреждений не следует.
Пример
В следующих примерах прозрачный метод пытается обратиться к критичной в плане безопасности универсальной коллекции, а также к критичным в плане безопасности полю и методу.
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();
}
}
}