CA2112: Tipos protegidos não devem expor campos

TypeName

SecuredTypesShouldNotExposeFields

CheckId

CA2112

<strong>Categoria</strong>

Microsoft.Security

Alteração significativa

Quebrando

Causa

Um tipo de público ou protegido contém campos públicos e é protegido por um Demandas de link.

Descrição da regra

Se o código possui acesso a uma instância de um tipo que é protegido por uma demanda de link, não tem o código atender à demanda de link para acessar os campos do tipo.

Como corrigir violações

Para corrigir uma violação desta regra, faça com que os campos confidenciais e adicionar propriedades públicas ou métodos que retornam os dados do campo. Verificações de segurança de LinkDemand nos tipos de protegem o acesso a propriedades e os métodos do tipo. No entanto, code access security não se aplica aos campos.

Quando suprimir avisos

Para questões de segurança e um bom design, você deve corrigir violações, tornando o confidenciais campos públicos. Você pode suprimir um aviso da regra, se o campo não conter informações que devem permanecer protegidas e você não confiar no conteúdo do campo.

Exemplo

O exemplo a seguir é composto de um tipo de biblioteca (SecuredTypeWithFields) com campos não seguras, um tipo (Distributor) que pode criar instâncias do tipo de biblioteca e instâncias de passagens incorreta para tipos não tem permissão para criar o código deles e o aplicativo que possa ler os campos da instância, mesmo que não tem a permissão que prende o tipo.

O seguinte código de biblioteca viola a regra.

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

O aplicativo não pode criar uma instância devido a demanda de link que protege o tipo de seguro. A classe a seguir habilita o aplicativo obter uma instância do tipo seguro.

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

O aplicativo a seguir ilustra como fazer isso, sem a permissão para acessar os métodos do tipo de seguro, código pode acessar seus campos.

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

O exemplo produz a seguinte saída.

        

Regras relacionadas

CA1051: Não declarar os campos de instância visível

Consulte também

Conceitos

Demandas de link

Outros recursos

Modelagem e acesso a dados