CA2119: Zapečeťte metody, které vyhovují privátním rozhraním
Vlastnost | Hodnota |
---|---|
ID pravidla | CA2119 |
Název | Zapečeťte metody, které vyhovují privátním rozhraním |
Kategorie | Zabezpečení |
Oprava způsobující chybu nebo chybu způsobující chybu | Narušující |
Povoleno ve výchozím nastavení v .NET 9 | No |
Příčina
Zděděný veřejný typ poskytuje přepisovatelnou implementaci internal
metody rozhraní (Friend
v jazyce Visual Basic).
Popis pravidla
Metody rozhraní mají veřejnou přístupnost, kterou nelze změnit implementováním typu. Interní rozhraní vytvoří kontrakt, který není určen k implementaci mimo sestavení, které definuje rozhraní. Veřejný typ, který implementuje metodu interního rozhraní pomocí virtual
modifikátoru (Overridable
v jazyce Visual Basic), umožňuje metodu přepsat odvozeným typem, který je mimo sestavení. Pokud druhý typ v definování sestavení volá metodu a očekává interní kontrakt, chování může být ohroženo, když se místo toho přepíše metoda ve vnějším sestavení. Tím se vytvoří ohrožení zabezpečení.
Jak opravit porušení
Chcete-li opravit porušení tohoto pravidla, zabráníte přepsání metody mimo sestavení pomocí některé z následujících možností:
Nastavení deklarujícího typu
sealed
(NotInheritable
v jazyce Visual Basic)Změňte přístupnost deklarujícího typu na
internal
(Friend
v jazyce Visual Basic).Odeberte všechny veřejné konstruktory z deklarujícího typu.
Implementujte metodu bez použití modifikátoru
virtual
.Implementujte metodu explicitně.
Kdy potlačit upozornění
Je bezpečné potlačit upozornění z tohoto pravidla, pokud po pečlivé kontrole neexistují žádné problémy zabezpečení, které by mohly být zneužitelné, pokud je metoda přepsána mimo sestavení.
Potlačení upozornění
Pokud chcete pouze potlačit jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, abyste pravidlo zakázali a znovu povolili.
#pragma warning disable CA2119
// The code that's violating the rule is on this line.
#pragma warning restore CA2119
Pokud chcete pravidlo pro soubor, složku nebo projekt zakázat, nastavte jeho závažnost v none
konfiguračním souboru.
[*.{cs,vb}]
dotnet_diagnostic.CA2119.severity = none
Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.
Příklad 1
Následující příklad ukazuje typ, BaseImplementation
který porušuje toto pravidlo.
// 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
Příklad 2
Následující příklad využívá implementaci virtuální metody předchozího příkladu.
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