Compartir a través de


CA2119: Sellar los métodos que cumplan las interfaces privadas

Nombre de tipo

SealMethodsThatSatisfyPrivateInterfaces

Identificador de comprobación

CA2119

Categoría

Microsoft.Security

Cambio problemático

Motivo

Un tipo público heredable proporciona una implementación de método reemplazable de una interfaz internal (Friend en Visual Basic).

Descripción de la regla

Los métodos de interfaz tienen accesibilidad pública y el tipo de implementación no lo puede cambiar.Una interfaz interna crea un contrato que no está destinado a implementarse fuera del ensamblado que define la interfaz.Un tipo público que implementa un método de una interfaz interna utilizando el modificador virtual (Overridable en Visual Basic) permite reemplazar el método por un tipo derivado que se encuentra fuera del ensamblado.Si un segundo tipo del ensamblado de definición llama al método y espera un contrato exclusivamente interno, esto podría afectar al rendimiento si, en su lugar, se ejecuta el método reemplazado en el ensamblado externo.Esto crea una vulnerabilidad de seguridad.

Cómo corregir infracciones

Para corregir una infracción de esta regla, evite que el método se invalide fuera del ensamblado; para ello, utilice una de las opciones siguientes:

  • Haga que el tipo declarativo sea sealed (NotInheritable en Visual Basic).

  • Cambie la accesibilidad del tipo declarativo a internal (Friend en Visual Basic).

  • Quite todos los constructores públicos del tipo declarativo.

  • Implemente el método sin utilizar el modificador virtual.

  • Implemente el método de manera explícita.

Cuándo suprimir advertencias

Es seguro suprimir una advertencia de esta regla si, después de una revisión atenta, se comprueba que no existe ningún problema de seguridad que pueda aprovecharse en caso de que el método se invalide fuera del ensamblado.

Ejemplo

El siguiente ejemplo muestra un tipo ( BaseImplementation) que infringe esta regla.

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.");
         }
      }
   };
}

El ejemplo siguiente se aprovecha de la implementación del método virtual del ejemplo 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.");
         }
      }
   };
}

Vea también

Referencia

Interfaces (Guía de programación de C#)

Otros recursos

Interfaces (Visual Basic)