CA2119 : Scellez les méthodes qui satisfont les interfaces privées

Propriété Value
Identificateur de la règle CA2119
Titre Scellez les méthodes qui satisfont les interfaces privées
Catégorie Sécurité
Le correctif est cassant ou non cassant Rupture
Activé par défaut dans .NET 8 Non

Cause

Un type public pouvant être hérité fournit une implémentation de méthode substituable d’une interface internal (Friend en Visual Basic).

Description de la règle

Les méthodes d’interface ont une accessibilité publique, qui ne peut pas être changée par le type d’implémentation. Une interface interne crée un contrat qui n’est pas destiné à être implémenté en dehors de l’assembly qui définit l’interface. Un type public qui implémente une méthode d’une interface interne à l’aide du modificateur virtual (Overridable en Visual Basic) permet à la méthode d’être remplacée par un type dérivé qui se trouve en dehors de l’assembly. Si un deuxième type dans l’assembly de définition appelle la méthode et s’attend à un contrat interne uniquement, le comportement peut être compromis lorsque, au lieu de cela, la méthode substituée dans l’assembly externe est exécutée. Cela engendre une vulnérabilité de sécurité.

Comment corriger les violations

Pour corriger une violation de cette règle, empêchez la méthode d’être substituée en dehors de l’assembly en adoptant l’une des approches suivantes :

  • Rendez le type déclarant sealed (NotInheritable en Visual Basic).

  • Remplacez l’accessibilité du type déclarant par internal (Friend en Visual Basic).

  • Supprimez tous les constructeurs publics du type déclarant.

  • Implémentez la méthode sans utiliser le modificateur virtual.

  • Implémentez la méthode explicitement.

Quand supprimer les avertissements

Vous pouvez sans risque supprimer un avertissement de cette règle si, après un examen attentif, il n’existe aucun problème de sécurité pouvant être exploitable si la méthode est substituée en dehors de l’assembly.

Supprimer un avertissement

Si vous voulez supprimer une seule violation, ajoutez des directives de préprocesseur à votre fichier source pour désactiver et réactiver la règle.

#pragma warning disable CA2119
// The code that's violating the rule is on this line.
#pragma warning restore CA2119

Pour désactiver la règle sur un fichier, un dossier ou un projet, définissez sa gravité sur none dans le fichier de configuration.

[*.{cs,vb}]
dotnet_diagnostic.CA2119.severity = none

Pour plus d’informations, consultez Comment supprimer les avertissements de l’analyse de code.

Exemple 1

L’exemple suivant montre un type, BaseImplementation, qui enfreint cette règle.

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

Exemple 2

L’exemple suivant exploite l’implémentation de méthode virtuelle de l’exemple précédent.

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

Voir aussi