CA2108: Revisar la seguridad declarativa en los tipos de valor
TypeName |
ReviewDeclarativeSecurityOnValueTypes |
Identificador de comprobación |
CA2108 |
Categoría |
Microsoft.Security |
Cambio problemático |
No |
Motivo
Un Datos y modelado en .NET Framework o Peticiones de vínculos protege un tipo de valor público o protegido.
Descripción de la regla
Antes de que otros constructores se ejecuten, los constructores predeterminados asignan e inicializan los tipos de valor.Si Demand o LinkDemand protegen un tipo de valor y el llamador no tiene permisos para cumplir la comprobación de seguridad, cualquier constructor que no sea el predeterminado producirá un error y se producirá una excepción de seguridad.No se desasigna el tipo de valor; permanece en el estado establecido por su constructor predeterminado.No suponga que un llamador que pasa una instancia del tipo de valor tiene permiso para crear o tener acceso a la instancia.
Cómo corregir infracciones
No puede corregir una infracción de esta regla a menos que quite la comprobación de seguridad del tipo y en su lugar utilice las comprobaciones de seguridad de nivel de método.Observe que al corregir la infracción de esta manera, no se evitará que los llamadores con permisos inadecuados obtengan instancias del tipo de valor.Debe asegurarse de que una instancia del tipo de valor, en su estado predeterminado, no exponga información confidencial y no se pueda utilizar de forma peligrosa.
Cuándo suprimir advertencias
Puede suprimir una advertencia de esta regla si un llamador puede obtener instancias del tipo de valor en su estado predeterminado sin representar ninguna amenaza para la seguridad.
Ejemplo
El ejemplo siguiente muestra una biblioteca que contiene un tipo de valor que infringe esta regla.Tenga en cuenta que el tipo StructureManager supone que un llamador que pasa una instancia del tipo de valor tiene permiso para crear o tener acceso a la instancia.
using System;
using System.Security;
using System.Security.Permissions;
[assembly:AllowPartiallyTrustedCallers]
namespace SecurityRulesLibrary
{
// Violates rule: ReviewDeclarativeSecurityOnValueTypes.
[System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.Demand, Name="FullTrust")]
public struct SecuredTypeStructure
{
internal double xValue;
internal double yValue;
public SecuredTypeStructure(double x, double y)
{
xValue = x;
yValue = y;
Console.WriteLine("Creating an instance of SecuredTypeStructure.");
}
public override string ToString()
{
return String.Format ("SecuredTypeStructure {0} {1}", xValue, yValue);
}
}
public class StructureManager
{
// This method asserts trust, incorrectly assuming that the caller must have
// permission because they passed in instance of the value type.
[System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.Assert, Name="FullTrust")]
public static SecuredTypeStructure AddStepValue(SecuredTypeStructure aStructure)
{
aStructure.xValue += 100;
aStructure.yValue += 100;
Console.WriteLine ("New values {0}", aStructure.ToString());
return aStructure;
}
}
}
La aplicación siguiente muestra la debilidad de la biblioteca.
using System;
using System.Runtime.InteropServices;
using System.Security;
using System.Security.Permissions;
using SecurityRulesLibrary;
// Run this test code with partial trust.
[assembly: System.Security.Permissions.PermissionSetAttribute(
System.Security.Permissions.SecurityAction.RequestRefuse,
Name="FullTrust")]
namespace TestSecurityExamples
{
public class TestDemandOnValueType
{
static SecuredTypeStructure mystruct;
[STAThread]
public static void Main()
{
try
{
mystruct = new SecuredTypeStructure(10,10);
}
catch (SecurityException e)
{
Console.WriteLine(
"Structure custom constructor: {0}", e.Message);
}
// The call to the default constructor
// does not throw an exception.
try
{
mystruct = StructureManager.AddStepValue(
new SecuredTypeStructure());
}
catch (SecurityException e)
{
Console.WriteLine(
"Structure default constructor: {0}", e.Message);
}
try
{
StructureManager.AddStepValue(mystruct);
}
catch (Exception e)
{
Console.WriteLine(
"StructureManager add step: {0}", e.Message);
}
}
}
}
Este ejemplo produce el siguiente resultado: