Los tipos seguros no deberían exponer campos
Actualización: noviembre 2007
Nombre de tipo |
SecuredTypesShouldNotExposeFields |
Identificador de comprobación |
CA2112 |
Categoría |
Microsoft.Security |
Cambio problemático |
Sí |
Motivo
Un tipo público o protegido contiene los campos públicos y está protegido por Peticiones de vínculos.
Descripción de la regla
Si el código tiene acceso a una instancia de tipo que está protegida por una solicitud de vínculo, el código no cumplirá la solicitud para obtener acceso a los campos del tipo.
Cómo corregir infracciones
Para corregir una infracción de esta regla, especifique los campos como no públicos y agregue propiedades o métodos públicos que devuelven los datos de campo. Las comprobaciones de seguridad de LinkDemand de los tipos protegen el acceso a las propiedades y métodos del tipo. Sin embargo, la seguridad de acceso a código no se aplica a los campos.
Cuándo suprimir advertencias
Tanto para evitar problemas de seguridad como para conseguir un diseño óptimo, debe corregir las infracciones estableciendo los campos públicos como no públicos. Puede suprimir una advertencia de esta regla si los campos no contienen información que deba permanecer segura y si no confía en el contenido del campo.
Ejemplo
El siguiente ejemplo está compuesto por un tipo de biblioteca (SecuredTypeWithFields) con campos no seguros, un tipo (Distributor) que crea instancias del tipo de la biblioteca y pasa erróneamente instancias a tipos que no tienen permiso para crearlas, y código de aplicación que puede leer los campos de la instancia a pesar de que no tiene el permiso que protege al tipo.
El código de la biblioteca siguiente infringe la regla.
using System;
using System.Reflection;
using System.Security;
using System.Security.Permissions;
namespace SecurityRulesLibrary
{
// This code requires immediate callers to have full trust.
[System.Security.Permissions.PermissionSetAttribute(
System.Security.Permissions.SecurityAction.LinkDemand,
Name="FullTrust")]
public class SecuredTypeWithFields
{
// Even though the type is secured, these fields are not.
// Violates rule: SecuredTypesShouldNotExposeFields.
public double xValue;
public double yValue;
public SecuredTypeWithFields (double x, double y)
{
xValue = x;
yValue = y;
Console.WriteLine(
"Creating an instance of SecuredTypeWithFields.");
}
public override string ToString()
{
return String.Format (
"SecuredTypeWithFields {0} {1}", xValue, yValue);
}
}
}
La aplicación no puede crear una instancia debido a la solicitud de vínculo que protege el tipo. La clase siguiente permite que la aplicación obtenga una instancia del tipo protegido.
using System;
using System.Reflection;
using System.Security;
using System.Security.Permissions;
// This assembly executes with full trust.
namespace SecurityRulesLibrary
{
// This type creates and returns instances of the secured type.
// The GetAnInstance method incorrectly gives the instance
// to a type that does not have the link demanded permission.
public class Distributor
{
static SecuredTypeWithFields s = new SecuredTypeWithFields(22,33);
public static SecuredTypeWithFields GetAnInstance ()
{
return s;
}
public static void DisplayCachedObject ()
{
Console.WriteLine(
"Cached Object fields: {0}, {1}", s.xValue , s.yValue);
}
}
}
La aplicación siguiente muestra cómo obtiene acceso el código a los campos sin el permiso para tener acceso a los métodos de un tipo protegido.
using System;
using System.Security;
using System.Security.Permissions;
using SecurityRulesLibrary;
// This code executes with partial trust.
[assembly: System.Security.Permissions.PermissionSetAttribute(
System.Security.Permissions.SecurityAction.RequestRefuse,
Name = "FullTrust")]
namespace TestSecurityExamples
{
public class TestLinkDemandOnField
{
[STAThread]
public static void Main()
{
// Get an instance of the protected object.
SecuredTypeWithFields secureType = Distributor.GetAnInstance();
// Even though this type does not have full trust,
// it can directly access the secured type's fields.
Console.WriteLine(
"Secured type fields: {0}, {1}",
secureType.xValue,
secureType.yValue);
Console.WriteLine("Changing secured type's field...");
secureType.xValue = 99;
// Distributor must call ToString on the secured object.
Distributor.DisplayCachedObject();
// If the following line is uncommented, a security
// exception is thrown at JIT-compilation time because
// of the link demand for full trust that protects
// SecuredTypeWithFields.ToString().
// Console.WriteLine("Secured type {0}",secureType.ToString());
}
}
}
Este ejemplo produce el siguiente resultado.
Creating an instance of SecuredTypeWithFields.
Secured type fields: 22, 33
Changing secured type's field...
Cached Object fields: 99, 33
Reglas relacionadas
No declarar campos de instancias visibles