CA2119: Métodos de selo que satisfaçam às interfaces privadas
TypeName |
SealMethodsThatSatisfyPrivateInterfaces |
CheckId |
CA2119 |
<strong>Categoria</strong> |
Microsoft.Security |
Alteração significativa |
Quebrando |
Causa
Um tipo de público herdável fornece uma implementação do método substituível de um internal (Friend em Visual Basic) interface.
Descrição da regra
Os métodos de interface ter 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 de público que implementa um método de uma interface interna usando o virtual (Overridable em Visual Basic) modificadora permite que o método a ser substituído por um tipo derivado que esteja fora do assembly.Se um segundo tipo no assembly definição chama o método e espera que um contrato apenas interno, o comportamento pode ficar comprometido quando, em vez disso, o método substituído no assembly externo é executado.Isso cria uma vulnerabilidade de segurança.
Como corrigir violações
Para corrigir uma violação desta regra, impedir que o método seja substituído fora do assembly usando um destes procedimentos:
Verifique o tipo declarativo sealed (NotInheritable em Visual Basic).
Alterar a acessibilidade do tipo declarativo a internal (Friend em Visual Basic).
Remova todos os construtores públicos o tipo declarativo.
Implementar o método sem usar o virtual modificador.
Implemente o método explicitamente.
Quando suprimir avisos
É seguro eliminar um aviso esta regra se, após uma análise criteriosa, não existe nenhum problema de segurança que pode ser pode ser explorada se o método é substituído fora do assembly.
Exemplo
O exemplo a seguir mostra um tipo, BaseImplementation, que viola essa regra.
Imports System
Namespace SecurityLibrary
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)
Console.WriteLine("Account number & balance.")
Else
Console.WriteLine("Please login.")
End If
End Sub
End Class
End Namespace
using System;
namespace SecurityLibrary
{
// 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.");
}
}
}
}
using namespace System;
namespace SecurityLibrary
{
// Internal by default.
interface class IValidate
{
bool UserIsValidated();
};
public ref class BaseImplementation : public IValidate
{
public:
virtual bool UserIsValidated()
{
return false;
}
};
public ref class UseBaseImplementation
{
public:
void SecurityDecision(BaseImplementation^ someImplementation)
{
if(someImplementation->UserIsValidated() == true)
{
Console::WriteLine("Account number & balance.");
}
else
{
Console::WriteLine("Please login.");
}
}
};
}
O exemplo a seguir explora a implementação do método virtual do exemplo anterior.
Imports System
Namespace SecurityLibrary
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)
Console.WriteLine("Account number & balance.")
Else
Console.WriteLine("Please login.")
End If
End Sub
End Class
End Namespace
using System;
namespace SecurityLibrary
{
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.");
}
}
}
}
using namespace System;
namespace SecurityLibrary
{
public ref class BaseImplementation
{
public:
virtual bool UserIsValidated()
{
return false;
}
};
public ref class UseBaseImplementation
{
public:
void SecurityDecision(BaseImplementation^ someImplementation)
{
if(someImplementation->UserIsValidated() == true)
{
Console::WriteLine("Account number & balance.");
}
else
{
Console::WriteLine("Please login.");
}
}
};
}
Consulte também
Referência
Interfaces (guia de programação do C#)