Lacrar métodos que satisfazem particular interfaces

TypeName

SealMethodsThatSatisfyPrivateInterfaces

CheckId

CA2119

Category (Categoria)

Microsoft.segurança

Quebrando alterar

Quebrando

Causa

Um tipo público herdável fornece uma implementação do método substituível de um internal (Friend no Visual Basic) da interface.

Descrição da regra

Métodos de interface tem acessibilidade pública, que não pode ser alterada pelo tipo de implementação.Uma interface interna cria um contrato que não se destina a ser implementado fora do assembly que define a interface.Um tipo public que implementa um método de uma interface interna usando o virtual (Overridable no Visual Basic) modificadora permite que o método a ser substituído por um tipo derivado que esteja fora do assembly. Se um segundo tipo no assembly definição chama o método e espera que um contrato apenas interno, o comportamento pode ficar comprometido quando, em vez disso, o método substituído no conjunto de módulos (assembly) externo é executado.Isso cria uma vulnerabilidade de segurança.

Como corrigir violações

Para corrigir uma violação dessa regra, impedir que o método seja substituído fora do assembly usando um dos seguintes procedimentos:

  • Verifique o tipo declarativo sealed (NotInheritable no Visual Basic).

  • Alterar o tipo declarativo a acessibilidade para internal (Friend no Visual Basic).

  • Remova todos os construtores públicos do tipo declarativo.

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

  • Implemente o método explicitamente.

Quando suprimir avisos

É seguro eliminar um aviso essa regra se, após uma análise criteriosa, não há problemas de segurança existem que pode ser explorável se o método for substituído fora do assembly.

Exemplo

O exemplo a seguir mostra um tipo, BaseImplementation, que viola essa 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 explora 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 C#)

Outros recursos

Interfaces em Visual Basic