Sdílet prostřednictvím


CA2122: Nezveřejňujte nepřímo metody s požadavky propojení

TypeName

DoNotIndirectlyExposeMethodsWithLinkDemands

CheckId

CA2122

Kategorie

Microsoft.Security

Narušující změna

Nenarušující

Příčina

Veřejný nebo chráněný člen má požadavek Požadavky na odkaz a je volán členem, který neprovádí žádné bezpečnostní kontroly.

Popis pravidla

Požadavek na odkaz kontroluje pouze oprávnění bezprostředního volajícího.Pokud člen X nevznáší žádné požadavky zabezpečení jeho volajících a volá kód chráněný požadavkem na odkaz, volající bez potřebných oprávnění může použít člen X pro přístup k chráněným členům.

Jak vyřešit porušení

Přidejte do členu požadavek zabezpečení Data a modelování v rozhraní .NET Framework nebo požadavek na odkaz, aby již neposkytoval nezabezpečený přístup ke členům chráněným požadavkem na odkaz.

Kdy potlačit upozornění

Chcete-li bezpečně potlačit upozornění tohoto pravidla, je nezbytné se ujistit, že kód neuděluje svým volajícím přístup k operacím a zdrojům, které mohou být použity škodlivým způsobem.

Příklad

Následující příklad ukazuje knihovnu porušující toto pravidlo a aplikaci, která demonstruje slabou stránku knihovny.Vzorová knihovna poskytuje dvě metody, které dohromady porušují pravidlo.Metoda EnvironmentSetting je zabezpečena požadavkem na odkaz pro neomezený přístup k proměnným prostředí.Metoda DomainInformation nevznáší na své volající před zavoláním metody EnvironmentSetting žádné bezpečnostní požadavky.

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

Následující aplikace volá nezabezpečený člen knihovny.

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

Tento příklad vytvoří následující výstup.

  

Viz také

Koncepty

Požadavky na odkaz

Další zdroje

Pokyny pro zabezpečené kódování

Data a modelování v rozhraní .NET Framework