Udostępnij za pośrednictwem


CA2108: Należy przeglądnąć zabezpieczenia deklaratywne typów wartościowych

TypeName

ReviewDeclarativeSecurityOnValueTypes

CheckId

CA2108

Kategoria

Microsoft.Security

Zmiana kluczowa

Niekluczowa

Przyczyna

Publiczny lub chroniony typ wartości jest zabezpieczony przez Dane i modelowanie w programie .NET Framework lub Żądania połączeń.

Opis reguły

Wartości typów są przydzielane i inicjowane przez ich konstruktory domyślne przed wykonaniem innych konstruktorów.Jeśli typ wartości jest zabezpieczony przez Demand lub LinkDemand i wywołujący nie ma uprawnień, które spełniają sprawdzenie zabezpieczeń, dowolny konstruktor inny niż domyślny nie powiedzie się i wygeneruje wyjątek zabezpieczeń.Typ wartości nie jest dealokowany; pozostaje w stanie ustalonym przez jego konstruktor domyślny.Nie należy zakładać, że wywołujący, który przekazuje wystąpienie typu wartości ma uprawnienia do tworzenia lub dostępu do wystąpienia.

Jak naprawić naruszenia

Nie można naprawić naruszenia tej zasady, dopóki sprawdzanie zabezpieczeń z typu nie zostanie usunięte i w ich miejscu użyte zabezpieczenia na poziomie metody.Należy zauważyć, że naprawa naruszenia w ten sposób nie zapobiega uzyskiwaniu wystąpień typów wartości przez wywołujących z niewystarczającymi uprawnieniami.Należy zapewnić, aby wystąpienie typu wartości, w stanie domyślnym nie ujawniało informacji poufnych i nie mogło być użyte w szkodliwy sposób.

Kiedy pominąć ostrzeżenia

Ostrzeżenie od tej reguły można pominąć, jeśli dowolny wywołujący może uzyskać wystąpienia typu wartości w jego stanie domyślnym bez stwarzania zagrożenia dla bezpieczeństwa.

Przykład

Poniższy przykład pokazuje bibliotekę, zawierającą typ wartości, naruszającą reguły.Należy zauważyć, że typ StructureManager zakłada, że wywołujący, który przekazuje wystąpienie typu wartości ma uprawnienia do tworzenia lub dostępu do wystąpienia.

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

[assembly:AllowPartiallyTrustedCallers]  

namespace SecurityRulesLibrary
{
   // Violates rule: ReviewDeclarativeSecurityOnValueTypes.
   [System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.Demand, Name="FullTrust")]

   public struct SecuredTypeStructure 
   {
      internal double xValue;
      internal double yValue;

      public SecuredTypeStructure(double x, double y) 
      {
         xValue = x;
         yValue = y;
         Console.WriteLine("Creating an instance of SecuredTypeStructure.");
      }     
      public override string ToString()
      {
         return String.Format ("SecuredTypeStructure {0} {1}", xValue, yValue);
      }
   }

   public class StructureManager
   {
      // This method asserts trust, incorrectly assuming that the caller must have  
      // permission because they passed in instance of the value type.
      [System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.Assert, Name="FullTrust")]

      public static SecuredTypeStructure AddStepValue(SecuredTypeStructure aStructure)
      {
         aStructure.xValue += 100;
         aStructure.yValue += 100;
         Console.WriteLine ("New values {0}", aStructure.ToString());
         return aStructure;
      }
   }
}

Następująca aplikacja demonstruje słabość biblioteki.

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

// Run this test code with partial trust.
[assembly: System.Security.Permissions.PermissionSetAttribute(
   System.Security.Permissions.SecurityAction.RequestRefuse, 
   Name="FullTrust")]

namespace TestSecurityExamples
{
   public class TestDemandOnValueType
   {
      static SecuredTypeStructure mystruct;

      [STAThread]
      public static void Main() 
      {
         try
         {
            mystruct = new SecuredTypeStructure(10,10);

         }
         catch (SecurityException e)
         {
            Console.WriteLine(
               "Structure custom constructor: {0}", e.Message);
         }

         // The call to the default constructor  
         // does not throw an exception. 
         try 
         {
            mystruct = StructureManager.AddStepValue(
               new SecuredTypeStructure());
         }
         catch (SecurityException e)
         {
            Console.WriteLine(
               "Structure default constructor: {0}", e.Message);
         }

         try 
         {
            StructureManager.AddStepValue(mystruct);
         } 

         catch (Exception e)
         {  
            Console.WriteLine(
               "StructureManager add step: {0}", e.Message);
         }
      }
   }
}

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

  

Zobacz też

Koncepcje

Żądania połączeń

Inne zasoby

Dane i modelowanie w programie .NET Framework