Share via


CA2112: Gesicherte Typen sollten keine Felder verfügbar machen.

Element Wert
RuleId CA2112
Category Microsoft.Security
Unterbrechende Änderung Breaking

Ursache

Ein öffentlicher oder geschützter Typ enthält öffentliche Felder und wird durch Linkaufrufe geschützt.

Hinweis

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

Regelbeschreibung

Wenn Code auf eine Instanz eines Typs zugreifen muss, der durch einen Linkaufruf gesichert ist, muss der Code für den Zugriff auf die Felder des Typs nicht die Anforderungen des Linkaufrufs erfüllen.

Behandeln von Verstößen

Um einen Verstoß gegen diese Regel zu beheben, machen Sie die Felder zu nicht öffentlichen Feldern, und fügen Sie öffentliche Eigenschaften oder Methoden hinzu, die die Felddaten zurückgeben. Linkaufruf-Sicherheitsprüfungen für Typen schützen den Zugriff auf die Eigenschaften und Methoden des Typs. Die Codezugriffssicherheit gilt jedoch nicht für Felder.

Wann sollten Warnungen unterdrückt werden?

Sowohl zum Schutz vor Sicherheitsproblemen als auch für einen optimalen Entwurf sollten Sie Verstöße beheben, indem Sie die öffentlichen Felder zu nicht öffentlichen Feldern machen. Sie können eine Warnung durch diese Regel unterdrücken, wenn das Feld keine zu schützenden Informationen enthält und Sie nicht auf den Inhalt des Felds angewiesen sind.

Beispiel

Das folgende Beispiel besteht aus einem Bibliothekstyp (SecuredTypeWithFields) mit ungeschützten Feldern, einem Typ (Distributor), der Instanzen des Bibliothekstyps erstellen kann und irrtümlicherweise Instanzen an Typen übergibt, die nicht über die erforderlichen Berechtigungen zum Erstellen verfügen, und Anwendungscode, der die Felder einer Instanz lesen kann, obwohl er nicht über die Berechtigung verfügt, die den Typ schützt.

Der folgende Bibliothekscode verstößt gegen die Regel.

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

namespace SecurityRulesLibrary
{
   // This code requires immediate callers to have full trust.
   [System.Security.Permissions.PermissionSetAttribute(
       System.Security.Permissions.SecurityAction.LinkDemand, 
       Name="FullTrust")]
   public class SecuredTypeWithFields 
   {
      // Even though the type is secured, these fields are not.
      // Violates rule: SecuredTypesShouldNotExposeFields.
      public double xValue;
      public double yValue;
      
      public SecuredTypeWithFields (double x, double y) 
      {
         xValue = x;
         yValue = y;
         Console.WriteLine(
            "Creating an instance of SecuredTypeWithFields.");
      }
      public override string ToString()
      {
          return String.Format (
            "SecuredTypeWithFields {0} {1}", xValue, yValue);
      }
   }
}

Beispiel 1

Die Anwendung kann aufgrund des Linkaufrufs, der den geschützten Typ schützt, keine Instanz erstellen. Mit der folgenden Klasse kann die Anwendung eine Instanz des geschützten Typs abrufen.

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

// This assembly executes with full trust. 

namespace SecurityRulesLibrary
{
   // This type creates and returns instances of the secured type.
   // The GetAnInstance method incorrectly gives the instance 
   // to a type that does not have the link demanded permission.

   public class Distributor
   {
      static SecuredTypeWithFields s = new SecuredTypeWithFields(22,33);
      public static SecuredTypeWithFields GetAnInstance ()
      {
            return s;
      }

      public static void DisplayCachedObject ()
      {
         Console.WriteLine(
            "Cached Object fields: {0}, {1}", s.xValue , s.yValue);
      }
   }
}

Beispiel 2

Die folgende Anwendung veranschaulicht, wie Code ohne Berechtigung für den Zugriff auf die Methoden eines geschützten Typs auf dessen Felder zugreifen kann.

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

// This code executes with partial trust.
[assembly: System.Security.Permissions.PermissionSetAttribute(
   System.Security.Permissions.SecurityAction.RequestRefuse,
   Name = "FullTrust")]
namespace TestSecurityExamples
{
    public class TestLinkDemandOnField
    {
        [STAThread]
        public static void Main()
        {
            // Get an instance of the protected object.
            SecuredTypeWithFields secureType = Distributor.GetAnInstance();

            // Even though this type does not have full trust,
            // it can directly access the secured type's fields.
            Console.WriteLine(
               "Secured type fields: {0}, {1}",
               secureType.xValue,
               secureType.yValue);
            Console.WriteLine("Changing secured type's field...");
            secureType.xValue = 99;

            // Distributor must call ToString on the secured object.
            Distributor.DisplayCachedObject();

            // If the following line is uncommented, a security 
            // exception is thrown at JIT-compilation time because 
            // of the link demand for full trust that protects 
            // SecuredTypeWithFields.ToString().

            // Console.WriteLine("Secured type {0}",secureType.ToString());
        }
    }
}

Dieses Beispiel erzeugt die folgende Ausgabe:

Creating an instance of SecuredTypeWithFields.
Secured type fields: 22, 33
Changing secured type's field...
Cached Object fields: 99, 33

Weitere Informationen