Partilhar via


Não exponha indiretamente métodos com demandas de link

TypeName

DoNotIndirectlyExposeMethodsWithLinkDemands

CheckId

CA2122

Category (Categoria)

Microsoft.segurança

Quebrando alterar

Não separável

Causa

Um membro público ou protegido tem um Demandas de link e é chamado por um membro não executa quaisquer verificações de segurança.

Descrição da regra

Uma demanda de link verifica as permissões do chamador imediato.Se um membro X não exige segurança de seus chamadores e chamadas de código protegido por uma demanda de link, um chamador sem a permissão necessária pode usar X para acessar o membro protegido.

Como corrigir violações

Adicionar um segurança Dados do Access ou link demanda para o membro, de modo que não fornece acesso desprotegido para o membro protegido por demanda de link.

Quando suprimir avisos

Para suprimir com segurança um aviso da regra, você deve certificar-se de que seu código não concede chamadores acesso a operações ou recursos que podem ser usados de maneira destrutiva.

Exemplo

Os exemplos a seguir mostram uma biblioteca que viola a regra e um aplicativo que demonstra o ponto fraco da biblioteca.A biblioteca de exemplo fornece dois métodos que violam a regra juntos.The EnvironmentSetting método é protegido por uma demanda de link para acesso irrestrito a variáveis de ambiente. The DomainInformation método faz com que não há demandas de segurança dos chamadores antes de chamar EnvironmentSetting.

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

namespace SecurityRulesLibrary
{
   public class DoNotIndirectlyExposeMethodsWithLinkDemands
   {
      // Violates rule: DoNotIndirectlyExposeMethodsWithLinkDemands.
      public static string DomainInformation()
      {
         return EnvironmentSetting("USERDNSDOMAIN");
      }

      // Library method with link demand.
      // This method holds its immediate callers responsible for securing the information.
      // Because a caller must have unrestricted permission, the method asserts read permission
      // in case some caller in the stack does not have this permission. 

      [EnvironmentPermissionAttribute(SecurityAction.LinkDemand, Unrestricted=true)]
      public static string EnvironmentSetting(string environmentVariable)
      {
         EnvironmentPermission envPermission = new EnvironmentPermission( EnvironmentPermissionAccess.Read,environmentVariable);
         envPermission.Assert();

         return Environment.GetEnvironmentVariable(environmentVariable);
      }
   }
}

O seguinte aplicativo chama o membro de biblioteca não segura.

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

// You have no permission to access the sensitive information,
// but you will get data from the unprotected method.
[assembly:EnvironmentPermissionAttribute(
   SecurityAction.RequestRefuse,Unrestricted=true)]
namespace TestUnsecuredMembers
{
   class TestUnsecured
   {
      [STAThread]
      static void Main(string[] args)
      {
         string value = null;
         try 
         {
            value = DoNotIndirectlyExposeMethodsWithLinkDemands.DomainInformation();
         }
         catch (SecurityException e) 
         {
            Console.WriteLine(
               "Call to unsecured member was stopped by code access security! {0}",
               e.Message);
            throw;
         }
         if (value != null) 
         {
            Console.WriteLine("Value from unsecured member: {0}", value);
         }
      }
   }
}

O exemplo produz a seguinte saída.

Value from unsecured member: seattle.corp.contoso.com

Consulte também

Conceitos

Demandas de link

Outros recursos

Diretrizes para Codificação Segura

Dados do Access