Compartilhar via


CA2119: os métodos para lacrar que atendam a interfaces privadas

TypeName

SealMethodsThatSatisfyPrivateInterfaces

CheckId

CA2119

Categoria

Microsoft.Security

Alteração Significativa

Quebra

Causa

Um tipo herdável utilitário fornece uma implementação substituível do método de uma interface de internal (Friend no Visual Basic).

Descrição da Regra

Os métodos da interface têm acessibilidade pública, que não pode ser alterada pelo tipo de implementação.Uma interface interna cria um contrato que não deve ser implementado fora do assembly que define a interface.Um tipo utilitário que implementa um método de uma interface interna usando o modificador de virtual (Overridable no Visual Basic) permite que o método foi substituído por um tipo derivado que está fora do assembly.Se um segundo no assembly de definição chama o método e aguarda um contrato interno somente leitura, comportamento poderia ser afetado quando, em vez disso, o método substituído no assembly externo é executado.Isso cria uma vulnerabilidade de segurança.

Como Corrigir Violações

Para corrigir uma violação desta regra, evitar o método de ser substituído fora do assembly usando um dos seguintes:

  • Faça o tipo declarando sealed (NotInheritable no Visual Basic).

  • Alterar a acessibilidade do tipo declarando a internal (Friend no Visual Basic).

  • Remover todos os construtores públicos do tipo declarando.

  • Implementar o método sem usar o modificador de virtual .

  • Implementar o método explicitamente.

Quando Suprimir Alertas

É seguro suprimir um aviso dessa regra se, depois de revisar cuidado, nenhuma problemas de segurança existentes que podem ser exploráveis se o método for substituído fora do assembly.

Exemplo

O exemplo a seguir mostra um tipo, BaseImplementation, que viola esta regra.

Imports System

Namespace SecurityLibrary

   Interface IValidate
      Function UserIsValidated() As Boolean 
   End Interface 

   Public Class BaseImplementation
      Implements IValidate

      Overridable Function UserIsValidated() As Boolean _ 
         Implements IValidate.UserIsValidated
         Return False 
      End Function 

   End Class 

   Public Class UseBaseImplementation

      Sub SecurityDecision(someImplementation As BaseImplementation)

         If(someImplementation.UserIsValidated() = True)
            Console.WriteLine("Account number & balance.")
         Else
            Console.WriteLine("Please login.")
         End If 

      End Sub 

   End Class 

End Namespace
using System;

namespace SecurityLibrary
{
   // Internal by default. 
   interface IValidate
   {
      bool UserIsValidated();
   }

   public class BaseImplementation : IValidate
   {
      public virtual bool UserIsValidated()
      {
         return false;
      }
   }

   public class UseBaseImplementation
   {
      public void SecurityDecision(BaseImplementation someImplementation)
      {
         if(someImplementation.UserIsValidated() == true)
         {
            Console.WriteLine("Account number & balance.");
         }
         else
         {
            Console.WriteLine("Please login.");
         }
      }
   }
}
using namespace System;

namespace SecurityLibrary
{
   // Internal by default. 
   interface class IValidate
   {
      bool UserIsValidated();
   };

   public ref class BaseImplementation : public IValidate
   {
   public:
      virtual bool UserIsValidated()
      {
         return false;
      }
   };

   public ref class UseBaseImplementation
   {
   public:
      void SecurityDecision(BaseImplementation^ someImplementation)
      {
         if(someImplementation->UserIsValidated() == true)
         {
            Console::WriteLine("Account number & balance.");
         }
         else
         {
            Console::WriteLine("Please login.");
         }
      }
   };
}

O exemplo a seguir explorar a implementação do método virtual do exemplo anterior.

Imports System

Namespace SecurityLibrary

   Public Class BaseImplementation

      Overridable Function UserIsValidated() As Boolean 
         Return False 
      End Function 

   End Class 

   Public Class UseBaseImplementation

      Sub SecurityDecision(someImplementation As BaseImplementation)

         If(someImplementation.UserIsValidated() = True)
            Console.WriteLine("Account number & balance.")
         Else
            Console.WriteLine("Please login.")
         End If 

      End Sub 

   End Class 

End Namespace
using System;

namespace SecurityLibrary
{
    public class BaseImplementation 
    {
        public virtual bool UserIsValidated()
        {
            return false;
        }
    }

    public class UseBaseImplementation
    {
        public void SecurityDecision(BaseImplementation someImplementation)
        {
            if (someImplementation.UserIsValidated() == true)
            {
                Console.WriteLine("Account number & balance.");
            }
            else
            {
                Console.WriteLine("Please login.");
            }
        }
    }
}
using namespace System;

namespace SecurityLibrary
{
   public ref class BaseImplementation
   {
   public:
      virtual bool UserIsValidated()
      {
         return false;
      }
   };

   public ref class UseBaseImplementation
   {
   public:
      void SecurityDecision(BaseImplementation^ someImplementation)
      {
         if(someImplementation->UserIsValidated() == true)
         {
            Console::WriteLine("Account number & balance.");
         }
         else
         {
            Console::WriteLine("Please login.");
         }
      }
   };
}

Consulte também

Referência

Interfaces (Guia de Programação em C#)

Outros recursos

Interfaces (Visual Basic)