Compartilhar via


CA2107: revisar uso de deny e permit only

TypeName

ReviewDenyAndPermitOnlyUsage

CheckId

CA2107

Categoria

Microsoft.Security

Alteração Significativa

Quebra

Causa

Um método contém uma verificação de segurança que especifica a ação de segurança de PermitOnly ou Deny.

Descrição da Regra

As ações de segurança de Usando o método PermitOnly e de CodeAccessPermission.Deny só deve ser usada pelas que têm um conhecimento avançado de segurança de .NET Framework .O código que usa essas ações de segurança deve passar pela revisão de segurança.

Negar altera o comportamento padrão de exames da pilha que ocorre em resposta a uma pesquisa de segurança.Permite especificar as permissões que não devem ser concedidas para a duração do método negando, independentemente das permissões reais dos chamadores na pilha de chamadas.Se a exames da pilha detecta um método que esteja protegido Deny, e se a permissão necessária é incluída nas permissões negado, a exames da pilha falha.PermitOnly também altera o comportamento padrão de exames de pilha.Permite que o código especifica apenas as permissões que podem ser concedidas, independentemente das permissões dos chamadores.Se a exames da pilha detecta um método que esteja protegido por PermitOnly, e se a permissão necessária não é incluída nas permissões que são especificadas por PermitOnly, a exames da pilha falha.

O código que depende dessas ações deve ser cuidadosamente avaliado para vulnerabilidades de segurança devido à sua utilidade limitada e comportamento sutil.Considere o seguinte:

  • Demandas de link não é afetado Deny ou por PermitOnly.

  • Se negar ou o PermitOnly ocorrem no mesmo quadro de pilhas que a demanda que causa a exames da pilha, as ações de segurança não têm nenhum efeito.

  • Os valores que são usados para construir permissões baseadas em geral caminho- podem ser especificados em várias maneiras.Negar acesso a um formulário de caminho não nega acesso a todos os formulários.Por exemplo, se \ de compartilhamento de arquivos servidor \ \ share é mapeado para uma unidade de rede X: , para negar acesso a um arquivo no compartilhamento, você deve negar servidor \ \ \ share \ Arquivo, X:\File e todos os outros caminho que acessa o arquivo.

  • CodeAccessPermission.Assert pode finalizar uma exames de pilha antes que negar ou o PermitOnly seja alcançado.

  • Deny se tiver qualquer efeito, isto é, quando um chamador tem uma permissão que está bloqueada negar, o chamador pode acessar o recurso protegido diretamente, ignorando negar.Da mesma forma, se o chamador não tiver a permissão negada, a exames da pilha falharia sem negar.

Como Corrigir Violações

O uso dessas ações causar uma violação de segurança.Para corrigir uma violação, não use estas ações de segurança.

Quando Suprimir Alertas

Suprima um aviso desta regra somente depois que você concluir uma análise de segurança.

Exemplo

O exemplo a seguir demonstra algumas restrições Deny.

A seguinte biblioteca contém uma classe que tem dois métodos que são idênticos com exceção das demandas de segurança que as protegem.

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

namespace SecurityRulesLibrary
{
   public   class SomeSecuredMethods
   {

      // Demand immediate caller has suitable permission 
      // before revealing sensitive data.
      [EnvironmentPermissionAttribute(SecurityAction.LinkDemand,
          Read="COMPUTERNAME;USERNAME;USERDOMAIN")]

      public static void MethodProtectedByLinkDemand()
      {
         Console.Write("LinkDemand: ");
      }

      [EnvironmentPermissionAttribute(SecurityAction.Demand,
          Read="COMPUTERNAME;USERNAME;USERDOMAIN")]

      public static void MethodProtectedByDemand()
      {
         Console.Write("Demand: ");
      }
   }
}

O aplicativo seguir demonstra os efeitos Deny os métodos seguros de biblioteca.

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

namespace TestSecurityLibrary
{
    // Violates rule: ReviewDenyAndPermitOnlyUsage. 
   public class TestPermitAndDeny
   {
      public static void TestAssertAndDeny()
      {
         EnvironmentPermission envPermission = new EnvironmentPermission(
               EnvironmentPermissionAccess.Read,
               "COMPUTERNAME;USERNAME;USERDOMAIN");
         envPermission.Assert();
         try
         {
            SomeSecuredMethods.MethodProtectedByDemand();
            Console.WriteLine(
               "Caller's Deny has no effect on Demand " + 
               "with the asserted permission.");

            SomeSecuredMethods.MethodProtectedByLinkDemand();
            Console.WriteLine(
               "Caller's Deny has no effect on LinkDemand " + 
               "with the asserted permission.");
         }
         catch (SecurityException e)
         {
            Console.WriteLine(
               "Caller's Deny protected the library.{0}", e);
         }
      }

      public static void TestDenyAndLinkDemand()
      {
         try
         {
            SomeSecuredMethods.MethodProtectedByLinkDemand();
            Console.WriteLine(
               "Caller's Deny has no effect with " +
               "LinkDemand-protected code.");
         }
         catch (SecurityException e)
         {
            Console.WriteLine(
               "Caller's Deny protected the library.{0}",e);
         }
      }

      public static void Main()
      {
         EnvironmentPermission envPermission = new EnvironmentPermission(
            EnvironmentPermissionAccess.Read,
            "COMPUTERNAME;USERNAME;USERDOMAIN");
         envPermission.Deny();

         //Test Deny and Assert interaction for LinkDemands and Demands.
         TestAssertAndDeny();

         //Test Deny's effects on code in different stack frame. 
         TestDenyAndLinkDemand();

         //Test Deny's effect on code in same frame as deny. 
         try
         {
            SomeSecuredMethods.MethodProtectedByLinkDemand();
            Console.WriteLine(
               "This Deny has no effect with LinkDemand-protected code.");
         }
         catch (SecurityException e)
         {
            Console.WriteLine("This Deny protected the library.{0}",e);
         }
      }
   }
}

O exemplo produz a seguinte saída.

  

Consulte também

Referência

CodeAccessPermission.PermitOnly

CodeAccessPermission.Assert

CodeAccessPermission.Deny

IStackWalk.PermitOnly

Conceitos

Substituindo verificações de segurança

Usando o método PermitOnly

Outros recursos

Diretrizes de codificação segura