Compartilhar via


CA2119: Selar métodos que atendem a interfaces particulares

Property Valor
ID da regra CA2119
Título Selar métodos que atendem a interfaces particulares
Categoria Segurança
Correção interruptiva ou sem interrupção Quebra
Habilitado por padrão no .NET 8 Não

Causa

Um tipo público herdável fornece uma implementação de método substituível de uma interface internal (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 modificador virtual (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 se, 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, evite que o método seja substituído fora do assembly usando uma das seguintes opções:

  • Faça o tipo declarativo sealed (NotInheritable no Visual Basic).

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

  • Remova todos os construtores públicos do tipo declarativo.

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

  • Implemente o método explicitamente.

Quando suprimir avisos

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

Suprimir um aviso

Para suprimir apenas uma violação, adicione diretivas de pré-processador ao arquivo de origem a fim de desabilitar e, em seguida, reabilitar 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 em um arquivo, uma pasta ou um projeto, defina a severidade 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

Confira também