CA2119: Zapieczętuj metody, które spełniają interfejsy prywatne
Właściwości | Wartość |
---|---|
Identyfikator reguły | CA2119 |
Tytuł | Pieczętuj metody, które spełniają wymagania interfejsów prywatnych |
Kategoria | Bezpieczeństwo |
Poprawka powodująca niezgodność lub niezgodność | Kluczowa |
Domyślnie włączone na platformie .NET 9 | Nie. |
Przyczyna
Typ publiczny, który można dziedziczyć, zapewnia zastępowalną implementację metody interfejsu internal
(Friend
w Visual Basic).
Opis reguły
Metody interfejsu mają publiczne ułatwienia dostępu, których nie można zmienić za pomocą typu implementowania. Interfejs wewnętrzny tworzy kontrakt, który nie ma być implementowany poza zestawem definiującym interfejs. Typ publiczny implementujący metodę interfejsu wewnętrznego przy użyciu virtual
modyfikatora (Overridable
w Visual Basic) umożliwia zastąpienie metody przez typ pochodny, który znajduje się poza zestawem. Jeśli drugi typ w zestawie definiujący wywołuje metodę i oczekuje kontraktu tylko wewnętrznego, zachowanie może zostać naruszone, gdy zamiast tego jest wykonywana metoda przesłonięta w zestawie zewnętrznym. Spowoduje to utworzenie luki w zabezpieczeniach.
Jak naprawić naruszenia
Aby naprawić naruszenie tej reguły, należy zapobiec przesłonięciu metody poza zestawem przy użyciu jednego z następujących elementów:
Ustaw typ
sealed
deklarowania (NotInheritable
w Visual Basic).Zmień dostępność typu deklarowanego na
internal
(Friend
w Visual Basic).Usuń wszystkie konstruktory publiczne z typu deklaratywnego.
Zaimplementuj metodę bez użycia
virtual
modyfikatora.Zaimplementuj metodę jawnie.
Kiedy pomijać ostrzeżenia
Można bezpiecznie pominąć ostrzeżenie z tej reguły, jeśli po dokładnym przejrzeniu nie istnieją żadne problemy z zabezpieczeniami, które mogą być wykorzystywane, jeśli metoda zostanie zastąpiona poza zestawem.
Pomijanie ostrzeżenia
Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.
#pragma warning disable CA2119
// The code that's violating the rule is on this line.
#pragma warning restore CA2119
Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none
w pliku konfiguracji.
[*.{cs,vb}]
dotnet_diagnostic.CA2119.severity = none
Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.
Przykład 1
W poniższym przykładzie przedstawiono typ , BaseImplementation
który narusza tę regułę.
// 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
Przykład 2
Poniższy przykład wykorzystuje implementację metody wirtualnej z poprzedniego przykładu.
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