Exportar (0) Imprimir
Expandir Tudo
Expandir Minimizar
Este artigo foi traduzido por máquina. Coloque o ponteiro do mouse sobre as frases do artigo para ver o texto original. Mais informações.
Tradução
Original
Este tópico ainda não foi avaliado como - Avalie este tópico

CA2114: a segurança de método deve ser um superconjunto de tipo

TypeName

MethodSecurityShouldBeASupersetOfType

CheckId

CA2114

Categoria

Microsoft.Security

Alteração significativa

Quebrando

Um tipo tem segurança declarativa e um de seus métodos tem segurança declarativa para a mesma ação de segurança e a ação de segurança não é Demandas de link ou Demandas de herança, e as permissões verificadas pelo tipo não são um subconjunto das permissões verificado pelo método.

Um método não deve ter tanto uma nível de método e tipo de segurança declarativa para a mesma ação. As duas verificações não são combinadas; a demanda de nível de método é aplicada. Por exemplo, se um tipo exige permissão X, e um de seus métodos exige permissão Y, código não precisa ter a permissão X para executar o método.

Revise seu código para certificar-se de que ambas as ações são necessárias. Se ambas as ações forem necessárias, certifique-se de que a ação de nível de método inclui a segurança especificada no nível de tipo. Por exemplo, se o seu tipo exige permissão X, e seu método deve também exigem permissão Y, o método deve demandar explicitamente X e Y.

É seguro eliminar um aviso esta regra se o método não requer que o especificado pelo tipo de segurança. No entanto, isso não é um cenário comum e pode indicar a necessidade de uma revisão cuidadosa do design.

O exemplo a seguir usa permissões de ambiente para demonstrar os perigos de violar a essa regra. Neste exemplo, o código do aplicativo cria uma instância do tipo segura antes de negar a permissão exigida pelo tipo. Em um cenário de ameaças do mundo real, o aplicativo exigiria outra maneira de obter uma instância do objeto.

No exemplo a seguir, as demandas de biblioteca permissão de gravação para um tipo em permissão de leitura para um método.


using System;
using System.Security;
using System.Security.Permissions;
using System.Runtime.InteropServices;

namespace SecurityRulesLibrary
{
   [EnvironmentPermissionAttribute(SecurityAction.Demand, Write="PersonalInfo")]
   public class MyClassWithTypeSecurity
   {
      [DllImport("kernel32.dll", CharSet=CharSet.Unicode, SetLastError=true)]
      [return:MarshalAs(UnmanagedType.Bool)]
      public static extern bool SetEnvironmentVariable(
         string lpName,
         string lpValue);

      // Constructor.
      public MyClassWithTypeSecurity(int year, int month, int day)
      {
         DateTime birthday = new DateTime(year, month, day);

         // Write out PersonalInfo environment variable.
         SetEnvironmentVariable("PersonalInfo",birthday.ToString());
      }

      [EnvironmentPermissionAttribute(SecurityAction.Demand, Read="PersonalInfo")]
      public string PersonalInformation ()
      { 
         // Read the variable.
         return Environment.GetEnvironmentVariable("PersonalInfo"); 
      }
   }
}


O seguinte código de aplicativo demonstra a vulnerabilidade da biblioteca, chamando o método, mesmo que ele não atende ao requisito de segurança em nível de tipo.


using System;
using System.Security;
using System.Security.Permissions;
using SecurityRulesLibrary;

namespace TestSecRulesLibrary
{
   public class TestMethodLevelSecurity
   {
      MyClassWithTypeSecurity dataHolder;

      void RetrievePersonalInformation(string description) 
      {
         try 
         { 
            Console.WriteLine(
               "{0} Personal information: {1}", 
               description, dataHolder.PersonalInformation());
         }
         catch (SecurityException e) 
         {
            Console.WriteLine(
               "{0} Could not access personal information: {1}", 
               description, e.Message);
         }
      }

      [STAThread]
      public static void Main() 
      {
         TestMethodLevelSecurity me = new TestMethodLevelSecurity();

         me.dataHolder = new MyClassWithTypeSecurity(1964,06,16);

         // Local computer zone starts with all environment permissions.
         me.RetrievePersonalInformation("[All permissions]");

         // Deny the write permission required by the type.
         EnvironmentPermission epw = new EnvironmentPermission(
            EnvironmentPermissionAccess.Write,"PersonalInfo");
         epw.Deny();

         // Even though the type requires write permission, 
         // and you do not have it; you can get the data.
         me.RetrievePersonalInformation(
            "[No write permission (demanded by type)]");

         // Reset the permissions and try to get 
         // data without read permission.
         CodeAccessPermission.RevertAll();  

         // Deny the read permission required by the method.
         EnvironmentPermission epr = new EnvironmentPermission(
            EnvironmentPermissionAccess.Read,"PersonalInfo");
         epr.Deny();

         // The method requires read permission, and you
         // do not have it; you cannot get the data.
         me.RetrievePersonalInformation(
            "[No read permission (demanded by method)]");
      }
   }
}


O exemplo produz a seguinte saída.

            
              [Todas as permissões] Informações pessoais: 16/6/1964 12: 00: 00 AM
[Nenhuma permissão de gravação (exigido por tipo)] Informações pessoais: 16/6/1964 12: 00: 00 AM
[Nenhuma permissão de leitura (exigido pelo método)] Não foi possível acessar informações pessoais: Falha na solicitação.
            
          
Isso foi útil para você?
(1500 caracteres restantes)
Agradecemos os seus comentários

Contribuições da comunidade

ADICIONAR
Mostrar:
© 2014 Microsoft. Todos os direitos reservados.