Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
| Eigenschap | Waarde |
|---|---|
| Regel-id | CA2119 |
| Titel | Afdichtingsmethoden die voldoen aan privéinterfaces |
| Categorie | Beveiliging |
| Fix kan brekend of niet-brekend zijn | Onderbreking |
| Standaard ingeschakeld in .NET 10 | Nee |
| Toepasselijke talen | C# en Visual Basic |
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. Een openbaar type dat een methode van een interne interface implementeert met behulp van de virtual-modifier (Overridable in Visual Basic), kan 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.
Hoe schendingen op te lossen
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(NotInheritablein Visual Basic) aan.Wijzig de toegankelijkheid van het declaratietype in
internal(Friendin Visual Basic).Verwijder alle openbare constructors van de typeverklaring.
Implementeer de methode zonder de
virtualmodifier te gebruiken.Implementeer de methode expliciet.
Wanneer waarschuwingen onderdrukken
Het is veilig om een waarschuwing van deze regel te onderdrukken als na zorgvuldige beoordeling geen beveiligingsproblemen bestaan die kunnen worden misbruikt als de methode buiten de assemblage 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 voor meer informatie Hoe codeanalysewaarschuwingen te onderdrukken.
Voorbeeld 1
In het volgende voorbeeld ziet u een type, BaseImplementationdat 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