CA2119: Tätningsmetoder som uppfyller privata gränssnitt
Property | Värde |
---|---|
Regel-ID | CA2119 |
Title | Tätningsmetoder som uppfyller privata gränssnitt |
Kategori | Säkerhet |
Korrigeringen är icke-bakåtkompatibel | Brott |
Aktiverad som standard i .NET 9 | Nej |
Orsak
En ärverbar offentlig typ ger en övergripande metodimplementering av ett internal
(Friend
i Visual Basic)-gränssnitt.
Regelbeskrivning
Gränssnittsmetoder har offentlig tillgänglighet, vilket inte kan ändras av implementeringstypen. Ett internt gränssnitt skapar ett kontrakt som inte är avsett att implementeras utanför sammansättningen som definierar gränssnittet. En offentlig typ som implementerar en metod för ett internt gränssnitt med hjälp virtual
av modifieraren (Overridable
i Visual Basic) tillåter att metoden åsidosätts av en härledd typ som ligger utanför sammansättningen. Om en andra typ i den definierande sammansättningen anropar metoden och förväntar sig ett internt kontrakt kan beteendet komprometteras när den åsidosatta metoden i den externa sammansättningen i stället körs. Detta skapar en säkerhetsrisk.
Så här åtgärdar du överträdelser
Om du vill åtgärda en överträdelse av den här regeln förhindrar du att metoden åsidosätts utanför sammansättningen med något av följande:
Gör deklareringstypen
sealed
(NotInheritable
i Visual Basic).Ändra tillgängligheten för deklareringstypen till
internal
(Friend
i Visual Basic).Ta bort alla offentliga konstruktorer från deklareringstypen.
Implementera metoden utan att använda
virtual
modifieraren.Implementera metoden explicit.
När du ska ignorera varningar
Det är säkert att ignorera en varning från den här regeln om det efter noggrann granskning inte finns några säkerhetsproblem som kan vara exploaterbara om metoden åsidosätts utanför sammansättningen.
Ignorera en varning
Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.
#pragma warning disable CA2119
// The code that's violating the rule is on this line.
#pragma warning restore CA2119
Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none
i konfigurationsfilen.
[*.{cs,vb}]
dotnet_diagnostic.CA2119.severity = none
Mer information finns i Så här utelämnar du kodanalysvarningar.
Exempel 1
I följande exempel visas en typ, BaseImplementation
, som bryter mot den här regeln.
// 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
Exempel 2
I följande exempel utnyttjas implementeringen av den virtuella metoden i föregående exempel.
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