Partilhar via


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

TypeName

DoNotIndirectlyExposeMethodsWithLinkDemands

CheckId

CA2122

<strong>Categoria</strong>

Microsoft.Security

Alteração significativa

Não separável

Causa

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

Descrição da regra

Uma demanda de link verifica as permissões do chamador imediato. Se um membro X faz nenhuma demandas de segurança de seus chamadores e as chamadas de código protegidas por um link exigem que um chamador sem a permissão necessária pode usar X para acessar o membro protegido.

Como corrigir violações

Adicionar uma segurança Modelagem e acesso a dados ou vincular a demanda para o membro, de modo que ele não fornece mais acesso desprotegido para link protegido de demanda de membro.

Quando suprimir avisos

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

Exemplo

Os exemplos a seguir mostram uma biblioteca que viola a regra e um aplicativo que demonstra a fraqueza da biblioteca. A biblioteca de amostra fornece dois métodos que juntos violam a regra. O EnvironmentSetting método é protegido por uma demanda de link para acesso irrestrito a variáveis de ambiente. O DomainInformation método não faz nenhuma demanda 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 da 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.

  

Consulte também

Conceitos

Diretrizes para Codificação Segura

Demandas de link

Outros recursos

Modelagem e acesso a dados