Share via


CA2119: Zapečeťte metody, které vyhovují privátním rozhraním

Vlastnost Hodnota
ID pravidla CA2119
Název Zapečeťte metody, které vyhovují privátním rozhraním
Kategorie Zabezpečení
Oprava způsobující chybu nebo chybu způsobující chybu Narušující
Povoleno ve výchozím nastavení v .NET 8 No

Příčina

Zděděný veřejný typ poskytuje přepisovatelnou implementaci internal metody rozhraní (Friend v jazyce Visual Basic).

Popis pravidla

Metody rozhraní mají veřejnou přístupnost, kterou nelze změnit implementováním typu. Interní rozhraní vytvoří kontrakt, který není určen k implementaci mimo sestavení, které definuje rozhraní. Veřejný typ, který implementuje metodu interního rozhraní pomocí virtual modifikátoru (Overridable v jazyce Visual Basic), umožňuje metodu přepsat odvozeným typem, který je mimo sestavení. Pokud druhý typ v definování sestavení volá metodu a očekává interní kontrakt, chování může být ohroženo, když se místo toho přepíše metoda ve vnějším sestavení. Tím se vytvoří ohrožení zabezpečení.

Jak opravit porušení

Chcete-li opravit porušení tohoto pravidla, zabráníte přepsání metody mimo sestavení pomocí některé z následujících možností:

  • Nastavení deklarujícího typu sealed (NotInheritable v jazyce Visual Basic)

  • Změňte přístupnost deklarujícího typu na internal (Friend v jazyce Visual Basic).

  • Odeberte všechny veřejné konstruktory z deklarujícího typu.

  • Implementujte metodu bez použití modifikátoru virtual .

  • Implementujte metodu explicitně.

Kdy potlačit upozornění

Je bezpečné potlačit upozornění z tohoto pravidla, pokud po pečlivé kontrole neexistují žádné problémy zabezpečení, které by mohly být zneužitelné, pokud je metoda přepsána mimo sestavení.

Potlačení upozornění

Pokud chcete pouze potlačit jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, abyste pravidlo zakázali a znovu povolili.

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

Pokud chcete pravidlo pro soubor, složku nebo projekt zakázat, nastavte jeho závažnost v none konfiguračním souboru.

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

Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.

Příklad 1

Následující příklad ukazuje typ, BaseImplementationkterý porušuje toto pravidlo.

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

Příklad 2

Následující příklad využívá implementaci virtuální metody předchozího příkladu.

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

Viz také