Share via


CA2107: Controllare l'utilizzo di Deny e PermitOnly

Articolo Valore
ID regola CA2107
Category Microsoft.Security
Modifica Interruzione

Causa

Un metodo contiene un controllo di sicurezza che specifica l'azione Di sicurezza PermitOnly o Nega.

Nota

Questa regola è stata deprecata. Per altre informazioni, vedere Regole deprecate.

Descrizione regola

L'azione System.Security.CodeAccessPermission.Deny di sicurezza deve essere usata solo da coloro che hanno una conoscenza avanzata della sicurezza .NET. Il codice che usa queste azioni di sicurezza deve essere sottoposto a una revisione della sicurezza.

Nega modifica il comportamento predefinito della procedura dettagliata dello stack che si verifica in risposta a una richiesta di sicurezza. Consente di specificare le autorizzazioni che non devono essere concesse per la durata del metodo di negazione, indipendentemente dalle autorizzazioni effettive dei chiamanti nello stack di chiamate. Se la procedura dettagliata dello stack rileva un metodo protetto da Deny e se l'autorizzazione richiesta è inclusa nelle autorizzazioni negate, la procedura di spostamento dello stack ha esito negativo. PermitOnly modifica anche il comportamento predefinito della procedura dettagliata dello stack. Consente al codice di specificare solo le autorizzazioni che possono essere concesse, indipendentemente dalle autorizzazioni dei chiamanti. Se la procedura dettagliata dello stack rileva un metodo protetto da PermitOnly e se l'autorizzazione richiesta non è inclusa nelle autorizzazioni specificate da PermitOnly, la procedura di spostamento dello stack ha esito negativo.

Il codice che si basa su queste azioni deve essere valutato attentamente per le vulnerabilità di sicurezza a causa dell'utilità limitata e del comportamento sottile. Tenere presente quanto segue:

  • Le richieste di collegamento non sono interessate da Deny o PermitOnly.

  • Se Deny o PermitOnly si verifica nello stesso stack frame della richiesta che causa la procedura dettagliata dello stack, le azioni di sicurezza non hanno alcun effetto.

  • I valori usati per costruire autorizzazioni basate su percorso possono in genere essere specificati in più modi. La negazione dell'accesso a una forma del percorso non nega l'accesso a tutti i moduli. Ad esempio, se una condivisione file \\Server\Share è mappata a un'unità di rete X:, per negare l'accesso a un file nella condivisione, è necessario negare \\Server\Share\File, X:\File e ogni altro percorso che accede al file.

  • Un System.Security.CodeAccessPermission.Assert oggetto può terminare una procedura dettagliata dello stack prima che venga raggiunto Deny o PermitOnly.

  • Se un elemento Deny ha alcun effetto, vale a dire quando un chiamante dispone di un'autorizzazione bloccata da Nega, il chiamante può accedere direttamente alla risorsa protetta ignorando nega. Analogamente, se il chiamante non dispone dell'autorizzazione negata, la procedura dello stack avrà esito negativo senza Nega.

Come correggere le violazioni

Qualsiasi uso di queste azioni di sicurezza causerà una violazione. Per correggere una violazione, non usare queste azioni di sicurezza.

Quando eliminare gli avvisi

Eliminare un avviso da questa regola solo dopo aver completato una verifica della sicurezza.

Esempio 1

Nell'esempio seguente vengono illustrate alcune limitazioni di Deny. La libreria contiene una classe con due metodi identici, ad eccezione delle richieste di sicurezza che li proteggono.

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

namespace SecurityRulesLibrary
{
   public  class SomeSecuredMethods
   {
    
      // Demand immediate caller has suitable permission
      // before revealing sensitive data.
      [EnvironmentPermissionAttribute(SecurityAction.LinkDemand,
          Read="COMPUTERNAME;USERNAME;USERDOMAIN")]

      public static void MethodProtectedByLinkDemand()
      {
         Console.Write("LinkDemand: ");
      }

      [EnvironmentPermissionAttribute(SecurityAction.Demand,
          Read="COMPUTERNAME;USERNAME;USERDOMAIN")]

      public static void MethodProtectedByDemand()
      {
         Console.Write("Demand: ");
      }
   }
}

Esempio 2

L'applicazione seguente illustra gli effetti di Deny sui metodi protetti dalla libreria.

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

namespace TestSecurityLibrary
{
    // Violates rule: ReviewDenyAndPermitOnlyUsage.
   public class TestPermitAndDeny
   {
      public static void TestAssertAndDeny()
      {
         EnvironmentPermission envPermission = new EnvironmentPermission(
               EnvironmentPermissionAccess.Read,
               "COMPUTERNAME;USERNAME;USERDOMAIN");
         envPermission.Assert();
         try
         {
            SomeSecuredMethods.MethodProtectedByDemand();
            Console.WriteLine(
               "Caller's Deny has no effect on Demand " + 
               "with the asserted permission.");

            SomeSecuredMethods.MethodProtectedByLinkDemand();
            Console.WriteLine(
               "Caller's Deny has no effect on LinkDemand " + 
               "with the asserted permission.");
         }
         catch (SecurityException e)
         {
            Console.WriteLine(
               "Caller's Deny protected the library.{0}", e);
         }
      }

      public static void TestDenyAndLinkDemand()
      {
         try
         {
            SomeSecuredMethods.MethodProtectedByLinkDemand();
            Console.WriteLine(
               "Caller's Deny has no effect with " +
               "LinkDemand-protected code.");
         }
         catch (SecurityException e)
         {
            Console.WriteLine(
               "Caller's Deny protected the library.{0}",e);
         }
      }
         
      public static void Main()
      {
         EnvironmentPermission envPermission = new EnvironmentPermission(
            EnvironmentPermissionAccess.Read,
            "COMPUTERNAME;USERNAME;USERDOMAIN");
         envPermission.Deny();

         //Test Deny and Assert interaction for LinkDemands and Demands.
         TestAssertAndDeny();

         //Test Deny's effects on code in different stack frame. 
         TestDenyAndLinkDemand();

         //Test Deny's effect on code in same frame as deny.
         try
         {
            SomeSecuredMethods.MethodProtectedByLinkDemand();
            Console.WriteLine(
               "This Deny has no effect with LinkDemand-protected code.");
         }
         catch (SecurityException e)
         {
            Console.WriteLine("This Deny protected the library.{0}",e);
         }
      }
   }
}

Nell'esempio viene prodotto l'output seguente:

Demand: Caller's Deny has no effect on Demand with the asserted permission.
LinkDemand: Caller's Deny has no effect on LinkDemand with the asserted permission.
LinkDemand: Caller's Deny has no effect with LinkDemand-protected code.
LinkDemand: This Deny has no effect with LinkDemand-protected code.

Vedi anche