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