CA2119: Zapieczętuj metody, które spełniają interfejsy prywatne

Właściwości Wartość
Identyfikator reguły CA2119
Stanowisko Pieczętuj metody, które spełniają wymagania interfejsów prywatnych
Kategoria Bezpieczeństwo
Poprawka powodująca niezgodność lub niezgodność Kluczowa
Domyślnie włączone na platformie .NET 8 Nie.

Przyczyna

Typ publiczny, który można dziedziczyć, zapewnia zastępowalną implementację metody interfejsu internal (Friend w Visual Basic).

Opis reguły

Metody interfejsu mają publiczne ułatwienia dostępu, których nie można zmienić za pomocą typu implementowania. Interfejs wewnętrzny tworzy kontrakt, który nie ma być implementowany poza zestawem definiującym interfejs. Typ publiczny implementujący metodę interfejsu wewnętrznego przy użyciu virtual modyfikatora (Overridable w Visual Basic) umożliwia zastąpienie metody przez typ pochodny, który znajduje się poza zestawem. Jeśli drugi typ w zestawie definiujący wywołuje metodę i oczekuje kontraktu tylko wewnętrznego, zachowanie może zostać naruszone, gdy zamiast tego jest wykonywana metoda przesłonięta w zestawie zewnętrznym. Spowoduje to utworzenie luki w zabezpieczeniach.

Jak naprawić naruszenia

Aby naprawić naruszenie tej reguły, należy zapobiec przesłonięciu metody poza zestawem przy użyciu jednego z następujących elementów:

  • Ustaw typ sealed deklarowania (NotInheritable w Visual Basic).

  • Zmień dostępność typu deklarowanego na internal (Friend w Visual Basic).

  • Usuń wszystkie konstruktory publiczne z typu deklaratywnego.

  • Zaimplementuj metodę bez użycia virtual modyfikatora.

  • Zaimplementuj metodę jawnie.

Kiedy pomijać ostrzeżenia

Można bezpiecznie pominąć ostrzeżenie z tej reguły, jeśli po dokładnym przejrzeniu nie istnieją żadne problemy z zabezpieczeniami, które mogą być wykorzystywane, jeśli metoda zostanie zastąpiona poza zestawem.

Pomijanie ostrzeżenia

Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.

#pragma warning disable CA2119
// The code that's violating the rule is on this line.
#pragma warning restore CA2119

Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none w pliku konfiguracji.

[*.{cs,vb}]
dotnet_diagnostic.CA2119.severity = none

Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.

Przykład 1

W poniższym przykładzie przedstawiono typ , BaseImplementationktóry narusza tę regułę.

// 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

Przykład 2

Poniższy przykład wykorzystuje implementację metody wirtualnej z poprzedniego przykładu.

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

Zobacz też