Share via


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 8 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 virtualOverridable (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, 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

Zie ook