Udostępnij za pośrednictwem


CA2112: Typy zabezpieczone nie powinny uwidaczniać pól

Pozycja Wartość
Ruleid CA2112
Kategoria Microsoft.Security
Zmiana powodująca niezgodność Kluczowa

Przyczyna

Typ publiczny lub chroniony zawiera pola publiczne i jest zabezpieczony przez żądania linków.

Uwaga

Ta reguła została przestarzała. Aby uzyskać więcej informacji, zobacz Przestarzałe reguły.

Opis reguły

Jeśli kod ma dostęp do wystąpienia typu zabezpieczonego przez żądanie łącza, kod nie musi spełniać zapotrzebowania na łącza, aby uzyskać dostęp do pól typu.

Jak naprawić naruszenia

Aby naprawić naruszenie tej reguły, wprowadź pola niepublicowe i dodaj właściwości publiczne lub metody zwracające dane pola. LinkDemand kontrole zabezpieczeń typów chronią dostęp do właściwości i metod typu. Jednak zabezpieczenia dostępu do kodu nie mają zastosowania do pól.

Kiedy pomijać ostrzeżenia

Zarówno w przypadku problemów z zabezpieczeniami, jak i w dobrym projekcie, należy rozwiązać naruszenia, tworząc pola publiczne niepublikowane. Możesz pominąć ostrzeżenie z tej reguły, jeśli pole nie przechowuje informacji, które powinny pozostać zabezpieczone, i nie polegasz na zawartości pola.

Przykład

Poniższy przykład składa się z typu biblioteki (SecuredTypeWithFields) z niezabezpieczonymi polami, typem (Distributor), który może tworzyć wystąpienia typu biblioteki i błędnie przekazuje wystąpienia do typów, nie ma uprawnień do ich tworzenia, a kod aplikacji, który może odczytywać pola wystąpienia, mimo że nie ma uprawnienia, które zabezpiecza typ.

Poniższy kod biblioteki narusza regułę.

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

Przykład 1

Aplikacja nie może utworzyć wystąpienia ze względu na zapotrzebowanie na łącze, które chroni zabezpieczony typ. Poniższa klasa umożliwia aplikacji uzyskanie wystąpienia zabezpieczonego typu.

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

Przykład 2

Poniższa aplikacja ilustruje, jak bez uprawnień dostępu do metod zabezpieczonego typu kod może uzyskać dostęp do swoich pól.

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

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

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

Zobacz też