Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
| Vlastnost | Hodnota |
|---|---|
| ID pravidla | CA2119 |
| Název | Zapečeťte metody, které vyhovují privátním rozhraním |
| Kategorie | Zabezpečení |
| Oprava, která může být destruktivní nebo nedestruktivní | Přerušující |
| Povoleno ve výchozím nastavení v .NET 10 | Ne |
| Příslušné jazyky | C# a Visual Basic |
Příčina
Veřejný typ, který lze dědit, poskytuje přepisovatelnou implementaci metody rozhraní internal (Friend v jazyce Visual Basic).
Popis pravidla
Metody rozhraní mají veřejnou přístupnost, kterou nemůže změnit implementující typ. 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 definujícím sestavení volá metodu a očekává, že jde o pouze interní kontrakt, může být chování narušeno, když je místo toho provedena přepsaná metoda v externím sestavení. Tím se vytvoří ohrožení zabezpečení.
Jak opravit porušení
Chcete-li opravit porušení tohoto pravidla, zabraňte přepsání metody mimo sestavení pomocí jedné z následujících metod:
Nastavení deklarujícího typu
sealed(NotInheritablev jazyce Visual Basic)Změňte přístupnost deklarujícího typu na
internal(Friendv 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 varování z tohoto pravidla, pokud po pečlivé kontrole neexistují žádné problémy se zabezpečením, které by mohly být zneužitelné, kdyby byla 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, BaseImplementationkterý 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