Udostępnij za pośrednictwem


CA2112: Typy zabezpieczone nie powinny uwidaczniać pól

TypeName

SecuredTypesShouldNotExposeFields

CheckId

CA2112

Kategoria

Microsoft.Security

Zmiana kluczowa

Kluczowa

Przyczyna

Typ publiczną lub chronioną zawiera pola publiczne i zabezpieczone przez Żądania połączeń.

Opis reguły

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

Jak naprawić naruszenia

Aby naprawić to naruszenie tej zasady, ustawianie niepublicznych pól i dodać publicznych właściwości lub metod, które zwracają dane pole.Kontrole bezpieczeństwa LinkDemand, typy ochrony dostępu do właściwości i metod typu.Jednakże zabezpieczenia dostępu do kodu nie dotyczą pól.

Kiedy pominąć ostrzeżenia

Zarówno dla problemów z zabezpieczeniami i dobry projekt powinny ustalić naruszenia, dokonując nonpublic pola publiczne.Ostrzeżenie od tej reguły można pominąć, jeśli pole nie przechowuje informacje, które powinny pozostać zabezpieczone, a nie należy polegać na zawartość pola.

Przykład

Poniższy przykład składa się z typu biblioteki (SecuredTypeWithFields) o polach niezabezpieczony: typ (Distributor) który można utworzyć wystąpienia typu biblioteki i wystąpień błędnych przechodzi do typów nie mają uprawnień do tworzenia je i aplikacji kod, który można przeczytać wystąpienie pola, nawet jeśli nie ma uprawnień, które zabezpiecza typu.

W poniższym kodzie 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);
      }
   }
}

Aplikacja nie może utworzyć wystąpienia ze względu na popyt łącza, która chroni zabezpieczonej typu.Poniższa klasa umożliwia aplikacji do uzyskania wystąpienia typu zabezpieczone.

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

Następująca aplikacja ilustruje, jak to zrobić, bez zgody na dostęp do zabezpieczonych typ metody, kod można uzyskać dostęp jej 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.

  

Powiązane reguły

CA1051: Nie deklaruj widocznych pól wystąpień

Zobacz też

Koncepcje

Żądania połączeń

Inne zasoby

Dane i modelowanie w programie .NET Framework