CA2140: O código Transparent não deve fazer referência itens essenciais de segurança
TypeName |
TransparentMethodsMustNotReferenceCriticalCode |
CheckId |
CA2140 |
<strong>Categoria</strong> |
Microsoft.Security |
Alteração significativa |
Quebrando |
Causa
Um método transparente:
lida com um tipo de exceção de segurança críticas de segurança
tem um parâmetro que está marcado como um tipo de segurança críticas
tem um parâmetro genérico com um restrições de segurança críticas
tem uma variável local de um tipo de segurança críticas
faz referência a um tipo que está marcado como de segurança crítico
chama um método que está marcado como de segurança crítico
faz referência a um campo que está marcado como de segurança crítico
Retorna um tipo que está marcado como de segurança crítico
Descrição da regra
Um elemento de código que é marcado com o SecurityCriticalAttribute atributo é crítica de segurança.Um método transparente não é possível usar um elemento crítico da segurança.Se um tipo transparente tenta usar um tipo de segurança crítica uma TypeAccessException, MethodAccessException , ou FieldAccessException é gerado.
Como corrigir violações
Para corrigir uma violação desta regra, siga um destes procedimentos:
Marcar o elemento de código que usa o código de segurança essenciais com o SecurityCriticalAttribute atributo
- ou -
Remover o SecurityCriticalAttribute o atributo de elementos de código que são marcadas como segurança críticos e em vez disso, marcá-las com o SecuritySafeCriticalAttribute ou SecurityTransparentAttribute atributo.
Quando suprimir avisos
Não suprimir um aviso da regra.
Exemplo
Nos exemplos a seguir, um método transparent tenta fazer referência a uma coleção genérica críticas de segurança, um campo de crítica de segurança e um método de segurança críticos.
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();
}
}
}