Freigeben über


CA2108: Deklarative Sicherheit auf Werttypen überprüfen.

Element Wert
RuleId CA2108
Category Microsoft.Security
Unterbrechende Änderung Nicht unterbrechend

Ursache

Ein öffentlicher oder geschützter Werttyp wird durch Daten und Modellierung oder Verknüpfungsaforderungen geschützt.

Hinweis

Diese Regel wurde als veraltet markiert. Weitere Informationen finden Sie unter Veraltete Regeln.

Regelbeschreibung

Werttypen werden von ihren Standardkonstruktoren zugewiesen und initialisiert, bevor andere Konstruktoren ausgeführt werden. Wenn ein Werttyp durch „Demand“ oder „LinkDemand“ geschützt ist und die Berechtigungen des Aufrufers der Sicherheitsüberprüfung nicht genügen, schlägt jeder andere Konstruktor als der Standardkonstruktor fehl, und es wird eine Sicherheitsausnahme ausgelöst. Die Zuordnung des Werttyps wird nicht aufgehoben, sondern er wird in dem Zustand belassen, der vom Standardkonstruktor festgelegt wurde. Setzen Sie nicht voraus, dass ein Aufrufer, der eine Instanz des Werttyps übergibt, über die Berechtigung zum Erstellen oder Zugreifen auf die Instanz verfügt.

Behandeln von Verstößen

Sie können einen Verstoß gegen diese Regel nur beheben, indem Sie die Sicherheitsüberprüfung aus dem Typ entfernen und stattdessen Sicherheitsüberprüfungen auf Methodenebene verwenden. Bei dieser Vorgehensweise zum Beheben des Verstoßes wird nicht verhindert, dass Aufrufer mit unzureichenden Berechtigungen Instanzen des Werttyps abrufen. Sie müssen sicherstellen, dass eine Instanz des Werttyps im Standardzustand keine vertraulichen Informationen offenlegt und nicht auf schädliche Weise verwendet werden kann.

Wann sollten Warnungen unterdrückt werden?

Sie können eine durch diese Regel ausgelöste Warnung unterdrücken, wenn ein beliebiger Aufrufer Instanzen des Werttyps im Standardzustand abrufen kann, ohne die Sicherheit zu gefährden.

Beispiel 1

Das folgende Beispiel zeigt eine Bibliothek mit einem Werttyp, der gegen diese Regel verstößt. Der Typ StructureManager setzt voraus, dass ein Aufrufer, der eine Instanz des Werttyps übergibt, über die Berechtigung zum Erstellen oder Zugreifen auf die Instanz verfügt.

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

Beispiel 2

Die folgende Anwendung zeigt die Schwächen der Bibliothek auf.

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

Dieses Beispiel erzeugt die folgende Ausgabe:

Structure custom constructor: Request failed.
New values SecuredTypeStructure 100 100
New values SecuredTypeStructure 200 200

Siehe auch