Partilhar via


Analisar a segurança declarativa em tipos de valor

TypeName

ReviewDeclarativeSecurityOnValueTypes

CheckId

CA2108

Category (Categoria)

Microsoft.segurança

Quebrando alterar

Não separável

Causa

Um tipo de valor público ou protegido é protegido por um Dados do Access ou Demandas de link.

Descrição da regra

Tipos de valor são alocados e inicializados por seus construtores padrão antes de executar outros construtores.Se um tipo de valor é protegido por uma demanda ou LinkDemand e o chamador não tem permissões que satisfazem a verificação de segurança, qualquer construtor diferente do padrão falhará e será lançada uma exceção de segurança.O tipo de valor não é desalocado; ela é deixada no estado definido pelo seu construtor padrão.Não pressuponha que um chamador passa uma instância do tipo de valor tem permissão para criar ou acesso a instância.

Como corrigir violações

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

Quando suprimir avisos

Se qualquer chamador pode obter instâncias do tipo de valor em seu estado padrão sem apresentando uma ameaça à segurança, você pode suprimir um aviso da regra.

Exemplo

O exemplo a seguir mostra uma biblioteca que contém um tipo de valor que violam essa regra.Observe que o StructureManager tipo de parte do pressuposto de que um chamador passa 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 a seguir demonstra ponto fraco da 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.

Structure custom constructor: Request failed. New values SecuredTypeStructure 100 100 New values SecuredTypeStructure 200 200

Consulte também

Conceitos

Demandas de link

Outros recursos

Dados do Access