CA2119: Methoden versiegeln, die die Bedingungen privater Schnittstellen erfüllen.
Eigenschaft | Wert |
---|---|
Regel-ID | CA2119 |
Titel | Methoden versiegeln, die die Bedingungen privater Schnittstellen erfüllen. |
Kategorie | Security |
Fix führt oder führt nicht zur Unterbrechung | Breaking |
Standardmäßig in .NET 9 aktiviert | No |
Ursache
Ein vererbbarer öffentlicher Typ stellt eine überschreibbare Methodenimplementierung einer internal
(Friend
in Visual Basic)-Schnitstelle bereit.
Regelbeschreibung
Schnittstellenmethoden haben öffentliche Barrierefreiheit, die nicht durch den implementierenden Typ geändert werden kann. Eine interne Schnittstelle erstellt einen Vertrag, der nicht für die Implementierung außerhalb der Assembly vorgesehen ist, die die Schnittstelle definiert. Ein öffentlicher Typ, der eine Methode einer internen Schnittstelle mit dem virtual
(Overridable
in Visual Basic)-Modifizierer implementiert, ermöglicht das Überschreiben der Methode durch einen abgeleiteten Typ außerhalb der Assembly. Wenn ein zweiter Typ in der definierenden Assembly die Methode aufruft und einen internen Vertrag erwartet, kann das Verhalten gefährdet werden, wenn stattdessen die überschriebene Methode in der externen Assembly ausgeführt wird. Diese Vorgehensweise stellt ein Sicherheitsrisiko dar.
Behandeln von Verstößen
Um einen Verstoß gegen diese Regel zu beheben, verhindern Sie, dass die Methode außerhalb der Assembly überschrieben wird, indem Sie eine der folgenden Lösungen anwenden:
Legen Sie den deklarierenden Typ
sealed
an (NotInheritable
in Visual Basic).Ändern Sie die Barrierfreiheit auf den deklarierenden Typ zu
internal
(Friend
in Visual Basic).Entfernen Sie alle öffentlichen Konstruktoren aus dem deklarierenden Typ.
Implementieren Sie die Methode ohne den
virtual
-Modifizierer.Implementieren Sie die Methode explizit.
Wann sollten Warnungen unterdrückt werden?
Es ist sicher, eine Warnung aus dieser Regel zu unterdrücken, wenn nach der sorgfältigen Überprüfung keine Sicherheitsprobleme vorhanden sind, die möglicherweise ausgenutzt werden, wenn die Methode außerhalb der Assembly überschrieben wird.
Unterdrücken einer Warnung
Um nur eine einzelne Verletzung zu unterdrücken, fügen Sie der Quelldatei Präprozessoranweisungen hinzu, um die Regel zu deaktivieren und dann wieder zu aktivieren.
#pragma warning disable CA2119
// The code that's violating the rule is on this line.
#pragma warning restore CA2119
Um die Regel für eine Datei, einen Ordner oder ein Projekt zu deaktivieren, legen Sie den Schweregrad in der Konfigurationsdatei auf none
fest.
[*.{cs,vb}]
dotnet_diagnostic.CA2119.severity = none
Weitere Informationen finden Sie unter Vorgehensweise: Unterdrücken von Codeanalyse-Warnungen.
Beispiel 1
Das folgende Beispiel zeigt einen Typ, BaseImplementation
, der gegen diese Regel verstößt.
// 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
Beispiel 2
Im folgenden Beispiel wird die Implementierung der virtuellen Methode des vorherigen Beispiels ausgenutzt.
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