Compartilhar via


CA2147: os métodos transparentes talvez não usem declarações de segurança

TypeName

SecurityTransparentCodeShouldNotAssert

CheckId

CA2147

Categoria

Microsoft.Security

Alteração Significativa

Quebra

Causa

Código que é marcado como SecurityTransparentAttribute não é concedido permissões suficientes para declarar.

Descrição da Regra

Esta regra analisa todos os métodos e em um assembly que é 100%/transparentes críticos transparentes ou mistos, e sinaliza o usam declarativo ou obrigatório de Assert.

Em tempo de execução, todas as chamadas a Assert de código transparente causarão InvalidOperationException a ser lançado.Isso pode ocorrer em ambos os assemblies transparentes 100%, e também assemblies transparentes/críticos mistos onde um método ou um tipo são declarados transparente, mas inclui um declarativo ou obrigatório declarar.

.NET Framework 2,0 introduziu um recurso nomeado transparência.Os métodos individuais, os campos, as interfaces, as classes, e tipos podem ser transparentes ou críticos.

O código transparente não é permitido elevar privilégios de segurança.Como consequência, todas as permissões concedidas ou exigidas ele são transmitidas automaticamente com o código ao domínio de aplicativo do chamador ou host.Os exemplos das subam incluem afirmam, LinkDemands, SuppressUnmanagedCode, e código de unsafe .

Como Corrigir Violações

Para resolver o problema, uma ou outra marca o código que chama declarar com SecurityCriticalAttribute, ou remove uma declaração.

Quando Suprimir Alertas

Não suprima uma mensagem desta regra.

Exemplo

Este código falhará se SecurityTestClass é transparente, quando o método de Assert gerencie InvalidOperationException.

using System;
using System.Security;
using System.Security.Permissions;

namespace TransparencyWarningsDemo
{

    public class TransparentMethodsUseSecurityAssertsClass
    {
        // CA2147 violation - transparent code using a security assert declaratively.  This can be fixed by 
        // any of: 
        //   1. Make DeclarativeAssert critical 
        //   2. Make DeclarativeAssert safe critical 
        //   3. Remove the assert attribute
        [PermissionSet(SecurityAction.Assert, Unrestricted = true)]
        public void DeclarativeAssert()
        {
        }

        public void ImperativeAssert()
        {
            // CA2147 violation - transparent code using a security assert imperatively.  This can be fixed by 
            // any of: 
            //   1. Make ImperativeAssert critical 
            //   2. Make ImperativeAssert safe critical 
            //   3. Remove the assert call 
            new PermissionSet(PermissionState.Unrestricted).Assert();
        }
    }
}

Uma opção é a revisão de código do método de SecurityTransparentMethod no exemplo abaixo, e se o método é considerado seguro para a alto, identificar SecurityTransparentMethod por meio de Seguro- crítico isso exige que uma auditoria de segurança, completo e detalhado, sem erros deve ser executado no método junto com todas as atendimento- saída que ocorram no método em uma declaração:

using System;
using System.Security.Permissions;

namespace SecurityTestClassLibrary
{
    public class SecurityTestClass
    {
        [System.Security.SecurityCritical]
        void SecurityCriticalMethod()
        {
            new FileIOPermission(PermissionState.Unrestricted).Assert();

            // perform I/O operations under Assert
        }
    }
}

Outra opção é remover uma declaração de código, e permite que qualquer fluxo de demandas subsequente de permissão de E/S de arquivo além de SecurityTransparentMethod ao chamador.Isso habilita verificações de segurança.Nesse caso, nenhum auditoria de segurança é necessário em geral, como as demandas de permissão fluirão ao chamador e/ou ao domínio de aplicativo.Exigências de permissão são bastante - controlado com a política de segurança, o ambiente de hospedagem, e as concessões de permissão de código de origem.

Consulte também

Outros recursos

Avisos de segurança