CA2114: безопасность метода должна быть надмножеством типа

Товар Значение
Идентификатор правила CA2114
Категория Microsoft.Security
Критическое изменение Критическое

Причина

Тип имеет декларативную безопасность, и один из его методов имеет декларативную безопасность для одного и того же действия безопасности, а действие безопасности не является требованием связи, а разрешения, проверка с типом, не являются подмножеством разрешений, проверка которые проверка методом.

Примечание.

Это правило устарело. Дополнительные сведения см. в разделе "Устаревшие правила".

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

Метод не должен иметь декларативную безопасность уровня метода и типа для одного действия. Два проверка не объединяются; применяется только спрос на уровне метода. Например, если тип требует разрешения, а один из его методов требует разрешенияXY, коду не требуется разрешение X на выполнение метода.

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

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

Когда лучше отключить предупреждения

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

Пример 1

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

В следующем примере библиотека требует разрешения на запись для типа и разрешения на чтение для метода.

using System;
using System.Security;
using System.Security.Permissions;
using System.Runtime.InteropServices;

namespace SecurityRulesLibrary
{
   [EnvironmentPermissionAttribute(SecurityAction.Demand, Write="PersonalInfo")]
   public class MyClassWithTypeSecurity
   {
      [DllImport("kernel32.dll", CharSet=CharSet.Unicode, SetLastError=true)]
      [return:MarshalAs(UnmanagedType.Bool)]
      public static extern bool SetEnvironmentVariable(
         string lpName,
         string lpValue);

      // Constructor.
      public MyClassWithTypeSecurity(int year, int month, int day)
      {
         DateTime birthday = new DateTime(year, month, day);

         // Write out PersonalInfo environment variable.
         SetEnvironmentVariable("PersonalInfo",birthday.ToString());
      }

      [EnvironmentPermissionAttribute(SecurityAction.Demand, Read="PersonalInfo")]
      public string PersonalInformation ()
      { 
         // Read the variable.
         return Environment.GetEnvironmentVariable("PersonalInfo"); 
      }
   }
}

Пример 2

Следующий код приложения демонстрирует уязвимость библиотеки, вызывая метод, даже если он не соответствует требованиям безопасности уровня типа.

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

namespace TestSecRulesLibrary
{
   public class TestMethodLevelSecurity
   {
      MyClassWithTypeSecurity dataHolder;

      void RetrievePersonalInformation(string description) 
      {
         try 
         { 
            Console.WriteLine(
               "{0} Personal information: {1}", 
               description, dataHolder.PersonalInformation());
         }
         catch (SecurityException e) 
         {
            Console.WriteLine(
               "{0} Could not access personal information: {1}", 
               description, e.Message);
         }
      }

      [STAThread]
      public static void Main() 
      {
         TestMethodLevelSecurity me = new TestMethodLevelSecurity();

         me.dataHolder = new MyClassWithTypeSecurity(1964,06,16);

         // Local computer zone starts with all environment permissions.
         me.RetrievePersonalInformation("[All permissions]");

         // Deny the write permission required by the type.
         EnvironmentPermission epw = new EnvironmentPermission(
            EnvironmentPermissionAccess.Write,"PersonalInfo");
         epw.Deny();
         
         // Even though the type requires write permission, 
         // and you do not have it; you can get the data.
         me.RetrievePersonalInformation(
            "[No write permission (demanded by type)]");

         // Reset the permissions and try to get 
         // data without read permission.
         CodeAccessPermission.RevertAll();  

         // Deny the read permission required by the method.
         EnvironmentPermission epr = new EnvironmentPermission(
            EnvironmentPermissionAccess.Read,"PersonalInfo");
         epr.Deny();

         // The method requires read permission, and you
         // do not have it; you cannot get the data.
         me.RetrievePersonalInformation(
            "[No read permission (demanded by method)]");
      }
   }
}

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

[All permissions] Personal information: 6/16/1964 12:00:00 AM
[No write permission (demanded by type)] Personal information: 6/16/1964 12:00:00 AM
[No read permission (demanded by method)] Could not access personal information: Request failed.

См. также