Share via


CA2119: Tätningsmetoder som uppfyller privata gränssnitt

Property Värde
Regel-ID CA2119
Rubrik Tätningsmetoder som uppfyller privata gränssnitt
Kategori Säkerhet
Korrigeringen är icke-bakåtkompatibel Bryta
Aktiverad som standard i .NET 8 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

Se även