CA2140: o código transparente não deve fazer referência a itens críticos de segurança
TypeName |
TransparentMethodsMustNotReferenceCriticalCode |
CheckId |
CA2140 |
Categoria |
Microsoft.Security |
Alteração Significativa |
Quebra |
Causa
Um método transparente:
trata um tipo de exceção crítico da segurança
tem um parâmetro que é marcado como um tipo crítico de segurança
tem um parâmetro genérica com restrições críticos de uma segurança
tem uma variável local de um tipo crítico de segurança
faz referência a um tipo que foi marcada como a segurança crítico
chama um método marcado como segurança crítico
se refere a um campo que foi marcada como a segurança crítico
retorna um tipo que foi marcada como a segurança crítico
Descrição da Regra
Um elemento de código que é marcado com o atributo de SecurityCriticalAttribute segurança é crítico.Um método transparente não pode usar um elemento fundamental de segurança.Se um tipo transparente tenta usar um tipo crítico de segurança TypeAccessException, MethodAccessException , ou FieldAccessException são gerados.
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 crítico de segurança com o atributo de SecurityCriticalAttribute
- ou -
Remover o atributo de SecurityCriticalAttribute dos elementos de código que são marcados como segurança crítico e os marcam vez com o atributo de SecuritySafeCriticalAttribute ou de SecurityTransparentAttribute .
Quando Suprimir Alertas
Não elimine um alerta desta regra.
Exemplo
Nos exemplos a seguir, um método transparente tentar referenciar uma coleção genérica crítico de segurança, um campo crítico de segurança, e um método crítico de segurança.
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();
}
}
}