Udostępnij za pośrednictwem


CA2122: Nie należy pośrednio ujawniać metod w żądaniach konsolidacji

TypeName

DoNotIndirectlyExposeMethodsWithLinkDemands

CheckId

CA2122

Kategoria

Microsoft.Security

Zmiana kluczowa

Niekluczowa

Przyczyna

Publiczny lub chroniony element członkowski ma Żądania połączeń i jest wywoływany przez element członkowski, który nie sprawdza zabezpieczeń.

Opis reguły

Żądanie łącza sprawdza uprawnienia tylko bezpośredniego wywołującego.Jeśli element członkowski X sprawia, że nie wymaga zabezpieczeń jego obiektu wywołującego i wywołań kodu chronionego przez żądanie łącza, obiekt wywołujący może bez niezbędnych uprawnień użyć X, aby uzyskać dostępu do chronionego elementu członkowskiego.

Jak naprawić naruszenia

Należy dodać Dane i modelowanie w programie .NET Framework zabezpieczeń lub żądanie łącza do elementu członkowskiego, tak aby nie dostarczał on więcej niezabezpieczonego dostępu do elementu członkowskiego chronionego żądania łącza.

Kiedy pominąć ostrzeżenia

Aby bezpiecznie pominąć ostrzeżenie od tej reguły, należy upewnić się, że kod nie przyznaje obiektom wywołującym dostępu do operacji lub zasobów, które mogą zostać użyte w sposób destrukcyjny.

Przykład

Następujące przykłady przedstawiają bibliotekę naruszającą regułę oraz aplikację, która demonstruje słabości biblioteki.Przykładowa biblioteka dostarcza dwie metody, które razem naruszają regułę.Metoda EnvironmentSetting jest zabezpieczona przez żądanie łącza dla nieograniczonego dostępu do zmiennych środowiskowych.Metoda DomainInformation sprawia, że nie wymaga zabezpieczeń jego obiektu wywołującego przed wywołaniem 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);
      }
   }
}

Następująca aplikacja wywołuje niezabezpieczony element członkowski biblioteki.

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

Ten przykład generuje następujące wyniki.

  

Zobacz też

Koncepcje

Żądania połączeń

Inne zasoby

Wytyczne dotyczące bezpiecznego programowania

Dane i modelowanie w programie .NET Framework