CA2108: Revisão de segurança declarativos sobre tipos de valor

TypeName

ReviewDeclarativeSecurityOnValueTypes

CheckId

CA2108

<strong>Categoria</strong>

Microsoft.Security

Alteração significativa

Não separável

Causa

Um tipo de valor público ou protegido é protegido por um Modelagem e acesso a dados ou Demandas de link.

Descrição da regra

Tipos de valor são alocados e inicializados por seus construtores padrão antes de executar a 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 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 assuma 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

A menos que você remover a verificação de segurança do tipo e verificações de segurança de nível de método de uso em seu lugar, você não pode corrigir uma violação desta regra. Observe que corrigir a violação dessa maneira não impedirá que os chamadores com permissões inadequadas obtenham as 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õem informações confidenciais e não pode ser usada de forma prejudicial.

Quando suprimir avisos

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

Exemplo

O exemplo a seguir mostra uma biblioteca que contém um tipo de valor viola essa regra. Observe que o StructureManager tipo assume 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 seguinte aplicativo demonstra a fraqueza 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.

      

Consulte também

Conceitos

Demandas de link

Outros recursos

Modelagem e acesso a dados