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