Partilhar via


CA2108: revisar segurança declarativa em tipos de valor

TypeName

ReviewDeclarativeSecurityOnValueTypes

CheckId

CA2108

Categoria

Microsoft.Security

Alteração Significativa

Sem Quebra

Causa

Um público ou um tipo de valor protegido são protegidos por Dados e modelagem no .NET Framework ou por Demandas de link.

Descrição da Regra

Os tipos de valor são atribuídos e inicializados pelos construtores padrão para que outros construtores executados.Se um tipo de valor é protegida por uma procurar ou por um LinkDemand, e o chamador não tem as permissões que satisfazem a verificação de segurança, todo o construtor diferente do padrão falhará, e uma exceção de segurança será gerada.O tipo de valor não é desalocada; é deixado no conjunto do estado pelo construtor padrão.Não suponha que um chamador que transmite uma instância do tipo de valor tem permissão para criar ou acessar a instância.

Como Corrigir Violações

Não é possível corrigir uma violação desta regra a menos que você remover a verificação de segurança de tipo, e usa verificações de segurança no nível de método em seu lugar.Observe que para corrigir a violação assim não impedirá que os chamadores com permissões inadequadas obtenham instâncias do tipo de valor.Você deve garantir que uma instância do tipo de valor, em seu estado padrão, não expõe informações confidenciais, e não pode ser usado em uma maneira prejudicial.

Quando Suprimir Alertas

Você pode suprimir um aviso dessa regra se qualquer chamador pode obter instâncias do tipo de valor em seu estado padrão sem gerar uma ameaça à segurança.

Exemplo

O exemplo a seguir mostra uma biblioteca que contém um tipo de valor que viola esta regra.Observe que o tipo de StructureManager supõe que um chamador que transmite uma instância do tipo de valor tem permissão para criar ou acessar a instância.

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

O aplicativo seguir demonstra a fraqueza de biblioteca.

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

O exemplo produz a seguinte saída.

  

Consulte também

Conceitos

Demandas de link

Outros recursos

Dados e modelagem no .NET Framework