Selle los métodos que cumplan las interfaces privadas
Actualización: noviembre 2007
TypeName |
SealMethodsThatSatisfyPrivateInterfaces |
Identificador de comprobación |
CA2119 |
Category |
Microsoft.Security |
Cambio problemático |
Sí |
Motivo
Un tipo público heredable proporciona una implementación de método reemplazable de una interfaz internal (Friend en Visual Basic).
Descripción de la regla
Los métodos de interfaz tienen accesibilidad pública y el tipo de implementación no lo puede cambiar. Una interfaz interna crea un contrato que no está destinado a implementarse fuera del ensamblado que define la interfaz. Un tipo público que implementa un método de una interfaz interna utilizando el modificador virtual (Overridable en Visual Basic) permite reemplazar el método por un tipo derivado que se encuentra fuera del ensamblado. Si un segundo tipo del ensamblado de definición llama al método y espera un contrato exclusivamente interno, esto podría afectar al rendimiento si, en su lugar, se ejecuta el método reemplazado en el ensamblado externo. Esto crea una vulnerabilidad de seguridad.
Cómo corregir infracciones
Para corregir una infracción de esta regla, evite que el método se invalide fuera del ensamblado; para ello, utilice una de las opciones siguientes:
Haga que el tipo declarativo sea sealed (NotInheritable en Visual Basic).
Cambie la accesibilidad del tipo declarativo a internal (Friend en Visual Basic).
Quite todos los constructores públicos del tipo declarativo.
Implemente el método sin utilizar el modificador virtual.
Implemente el método de manera explícita.
Cuándo suprimir advertencias
Es seguro suprimir una advertencia de esta regla si, después de una revisión atenta, se comprueba que no existe ningún problema de seguridad que pueda aprovecharse en caso de que el método se invalide fuera del ensamblado.
Ejemplo
El siguiente ejemplo muestra un tipo (BaseImplementation) que infringe esta regla.
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.");
}
}
};
}
El ejemplo siguiente se aprovecha de la implementación del método virtual del ejemplo 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.");
}
}
};
}
Vea también
Referencia
Interfaces (Guía de programación de C#)