CA2122 : N'exposez pas indirectement des méthodes avec des demandes de liaisonCA2122: Do not indirectly expose methods with link demands

TypeNameTypeName DoNotIndirectlyExposeMethodsWithLinkDemandsDoNotIndirectlyExposeMethodsWithLinkDemands
CheckIdCheckId CA2122CA2122
CategoryCategory Microsoft.SecurityMicrosoft.Security
Modification avec ruptureBreaking Change Sans ruptureNon Breaking

CauseCause

Un membre public ou protégé a un demandes de liaison et est appelée par un membre qui n’effectue pas les vérifications de sécurité.A public or protected member has a Link Demands and is called by a member that does not perform any security checks.

Description de la règleRule description

Une demande de liaison vérifie uniquement les autorisations de l’appelant immédiat.A link demand checks the permissions of the immediate caller only. Si un membre X n’effectue aucune des demandes de sécurité de ses appelants et appelle un code protégé par une demande de liaison, un appelant sans l’autorisation nécessaire peut utiliser X pour accéder au membre protégé.If a member X makes no security demands of its callers, and calls code protected by a link demand, a caller without the necessary permission can use X to access the protected member.

Comment corriger les violationsHow to fix violations

Ajouter une sécurité données et modélisation ou demande de liaison au membre afin qu’il ne fournit plus accès non sécurisé au membre protégé par demande de liaison.Add a security Data and Modeling or link demand to the member so that it no longer provides unsecured access to the link demand-protected member.

Quand supprimer les avertissementsWhen to suppress warnings

Pour supprimer sans risque un avertissement de cette règle, il se peut que vous devez vous assurer que votre code n’accorde pas ses appelants accès à des opérations ou des ressources qui peuvent être utilisées dans une action destructrice.To safely suppress a warning from this rule, you must make sure that your code does not grant its callers access to operations or resources that can be used in a destructive manner.

Exemple 1Example 1

Les exemples suivants montrent une bibliothèque qui viole la règle et une application qui montre la faiblesse de la bibliothèque.The following examples show a library that violates the rule, and an application that demonstrates the library's weakness. L’exemple de bibliothèque fournit deux méthodes qui ensemble enfreignent la règle.The sample library provides two methods that together violate the rule. Le EnvironmentSetting méthode est sécurisée par une demande de liaison pour un accès illimité aux variables d’environnement.The EnvironmentSetting method is secured by a link demand for unrestricted access to environment variables. Le DomainInformation méthode n’effectue aucune des demandes de sécurité de ses appelants avant d’appeler EnvironmentSetting.The DomainInformation method makes no security demands of its callers before it calls 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);
      }
   }
}

Exemple 2Example 2

L’application suivante appelle le membre de bibliothèque non sécurisé.The following application calls the unsecured library member.

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

Cet exemple génère la sortie suivante :This example produces the following output:

*Value from unsecured member: seattle.corp.contoso.com

Voir aussiSee also