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 8 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

Consulte también