Partilhar via


CA2119: Métodos de vedação que satisfazem interfaces privadas

Property valor
ID da regra CA2119
Título Métodos de vedação que satisfazem interfaces privadas
Categoria Segurança
A correção está quebrando ou não quebrando Quebrando
Habilitado por padrão no .NET 9 Não

Motivo

Um tipo público hereditário fornece uma implementação de método substituível de uma internal interface (Friend no Visual Basic).

Descrição da regra

Os métodos de interface têm acessibilidade pública, que não pode ser alterada pelo tipo de implementação. Uma interface interna cria um contrato que não se destina a ser implementado fora do assembly que define a interface. Um tipo público que implementa um método de uma interface interna usando o virtual modificador (Overridable no Visual Basic) permite que o método seja substituído por um tipo derivado que está fora do assembly. Se um segundo tipo no assembly definidor chamar o método e esperar um contrato somente interno, o comportamento poderá ser comprometido quando, em vez disso, o método substituído no assembly externo for executado. Isso cria uma vulnerabilidade de segurança.

Como corrigir violações

Para corrigir uma violação dessa regra, impeça que o método seja substituído fora do assembly usando uma das seguintes opções:

  • Faça o tipo sealed de declaração (NotInheritable no Visual Basic).

  • Altere a acessibilidade do tipo declarante para internal (Friend no Visual Basic).

  • Remova todos os construtores públicos do tipo de declaração.

  • Implemente o método sem usar o virtual modificador.

  • Implemente o método explicitamente.

Quando suprimir avisos

É seguro suprimir um aviso dessa regra se, após uma revisão cuidadosa, não existirem problemas de segurança que possam ser explorados se o método for substituído fora do assembly.

Suprimir um aviso

Se você quiser apenas suprimir uma única violação, adicione diretivas de pré-processador ao seu arquivo de origem para desativar e, em seguida, reativar a regra.

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

Para desabilitar a regra de um arquivo, pasta ou projeto, defina sua gravidade como none no arquivo de configuração.

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

Para obter mais informações, consulte Como suprimir avisos de análise de código.

Exemplo 1

O exemplo a seguir mostra um tipo, BaseImplementation, que viola essa regra.

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

Exemplo 2

O exemplo a seguir explora a implementação do método virtual do exemplo anterior.

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

Consulte também