CA2119: Sellar los métodos que satisfacen las interfaces privadas
Propiedad | Value |
---|---|
Identificador de la regla | CA2119 |
Título | Sellar los métodos que satisfacen las interfaces privadas |
Categoría | Seguridad |
La corrección interrumpe o no interrumpe | Problemático |
Habilitado de forma predeterminada en .NET 9 | No |
Causa
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, que el tipo de implementación no puede cambiar. Una interfaz interna crea un contrato que no está pensado para implementarse fuera del ensamblado que define la interfaz. Un tipo público que implementa un método de una interfaz interna mediante el modificador virtual
(Overridable
en Visual Basic) permite que un tipo derivado que está fuera del ensamblado invalide el método. Si un segundo tipo del ensamblado de definición llama al método y espera un contrato solo interno, el comportamiento puede verse comprometido cuando, en su lugar, se ejecuta el método invalidado en el ensamblado externo. Esto crea una vulnerabilidad de seguridad.
Cómo corregir infracciones
Para corregir una infracción de esta regla, impida que el método se invalide fuera del ensamblado mediante uno de los procedimientos siguientes:
Realizar el tipo declarativo
sealed
(NotInheritable
en Visual Basic).Cambiar la accesibilidad del tipo declarativo a
internal
(Friend
en Visual Basic).Quitar todos los constructores públicos del tipo declarativo.
Implementar el método sin usar el modificador
virtual
.Implementar el método explícitamente.
Cuándo suprimir las advertencias
Se puede suprimir una advertencia de esta regla si, después de una revisión cuidadosa, no existe ningún problema de seguridad que pueda aprovecharse si el método se invalida fuera del ensamblado.
Supresión de una advertencia
Si solo quiere suprimir una única infracción, agregue directivas de preprocesador al archivo de origen para deshabilitar y volver a habilitar la regla.
#pragma warning disable CA2119
// The code that's violating the rule is on this line.
#pragma warning restore CA2119
Para deshabilitar la regla de un archivo, una carpeta o un proyecto, establezca su gravedad en none
del archivo de configuración.
[*.{cs,vb}]
dotnet_diagnostic.CA2119.severity = none
Para obtener más información, consulte Procedimiento para suprimir advertencias de análisis de código.
Ejemplo 1
En el ejemplo siguiente se muestra un tipo, BaseImplementation
, que infringe la regla.
// 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.");
}
}
}
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) Then
Console.WriteLine("Account number & balance.")
Else
Console.WriteLine("Please login.")
End If
End Sub
End Class
Ejemplo 2
En el ejemplo siguiente se aprovecha la implementación del método virtual del ejemplo anterior.
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.");
}
}
}
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) Then
Console.WriteLine("Account number & balance.")
Else
Console.WriteLine("Please login.")
End If
End Sub
End Class