CA2119: Afdichtingsmethoden die voldoen aan privé-interfaces
Eigenschappen | Weergegeven als |
---|---|
Regel-id | CA2119 |
Titel | Afdichtingsmethoden die voldoen aan privéinterfaces |
Categorie | Beveiliging |
Oplossing is brekend of niet-brekend | Breken |
Standaard ingeschakeld in .NET 9 | Nee |
Oorzaak
Een overgenomen openbaar type biedt een overschrijfbare methode-implementatie van een internal
(Friend
in Visual Basic)-interface.
Beschrijving van regel
Interfacemethoden hebben openbare toegankelijkheid, die niet kunnen worden gewijzigd door het implementatietype. Een interne interface maakt een contract dat niet bedoeld is om buiten de assembly te worden geïmplementeerd die de interface definieert. Met een openbaar type waarmee een methode van een interne interface wordt geïmplementeerd met behulp van de virtual
Overridable
(in Visual Basic)-modifier, kan de methode worden overschreven door een afgeleid type dat zich buiten de assembly bevindt. Als een tweede type in de definiërende assembly de methode aanroept en een intern contract verwacht, kan het gedrag worden aangetast wanneer in plaats daarvan de overschreven methode in de externe assembly wordt uitgevoerd. Hiermee wordt een beveiligingsprobleem gemaakt.
Schendingen oplossen
Als u een schending van deze regel wilt oplossen, voorkomt u dat de methode buiten de assembly wordt overschreven door een van de volgende handelingen uit te voeren:
Geef het declaratietype
sealed
(NotInheritable
in Visual Basic) aan.Wijzig de toegankelijkheid van het declaratietype in
internal
(Friend
in Visual Basic).Verwijder alle openbare constructors uit het declaratietype.
Implementeer de methode zonder de
virtual
modifier te gebruiken.Implementeer de methode expliciet.
Wanneer waarschuwingen onderdrukken
Het is veilig om een waarschuwing van deze regel te onderdrukken als er na zorgvuldige beoordeling geen beveiligingsproblemen bestaan die kunnen worden misbruikt als de methode buiten de assembly wordt overschreven.
Een waarschuwing onderdrukken
Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de regel uit te schakelen en vervolgens opnieuw in te schakelen.
#pragma warning disable CA2119
// The code that's violating the rule is on this line.
#pragma warning restore CA2119
Als u de regel voor een bestand, map of project wilt uitschakelen, stelt u de ernst none
ervan in op het configuratiebestand.
[*.{cs,vb}]
dotnet_diagnostic.CA2119.severity = none
Zie Codeanalysewaarschuwingen onderdrukken voor meer informatie.
Voorbeeld 1
In het volgende voorbeeld ziet u een type, BaseImplementation
dat deze regel schendt.
// 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
Voorbeeld 2
In het volgende voorbeeld wordt gebruik gemaakt van de implementatie van de virtuele methode van het vorige voorbeeld.
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