Поделиться через


CA2122: не используйте косвенное представление методов с запросами компоновки

TypeName

DoNotIndirectlyExposeMethodsWithLinkDemands

CheckId

CA2122

Категория

Microsoft.Security

Критическое изменение

Не критическое

Причина

Открытый или защищенный член имеет Требования связывания и вызывается членом, который не выполняет каких-либо проверок безопасности.

Описание правила

Запрос компоновки проверяет разрешения только непосредственно вызывающего метода.Если член X не предъявляет требований к безопасности своих вызывающих методов и вызывает код, защищенный запросом компоновки, вызывающий метод без необходимого разрешения может использовать X для доступа к защищенному члену.

Устранение нарушений

Добавьте безопасный Данные и модели в .NET Framework или запрос компоновки к члену, так чтобы он более не предоставлял небезопасный доступ к члену, защищенному запросом компоновки.

Отключение предупреждений

Чтобы отключить предупреждения из этого правила без последствий, необходимо удостовериться, чтобы код не предоставлял доступ к операциям или ресурсам, которые можно использовать небезопасным образом.

Пример

В следующих примерах показана библиотека, нарушающая правило, а также приложение, демонстрирующее слабость библиотеки.Пример библиотеки содержит два метода, которые вместе нарушают правило.Метод EnvironmentSetting защищен запросом компоновки для предоставления сборкам неограниченного доступа ко всем переменным среды.Метод DomainInformation не предъявляет требований к безопасности своих вызывающих методов, так как он вызывает 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);
      }
   }
}

Следующее приложение вызывает незащищенный член библиотеки.

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);
         }
      }
   }
}

В результате выполнения примера получается следующий результат:

  

См. также

Основные понятия

Требования связывания

Другие ресурсы

Правила написания безопасного кода

Данные и модели в .NET Framework