CA2151: Los campos con tipos críticos deben ser críticos para la seguridad
TypeName |
|
Identificador de comprobación |
CA2151 |
Categoría |
Microsoft.Security |
Cambio problemático |
Problemático |
Motivo
Se declara un campo transparente para la seguridad o un campo crítico seguro.Su tipo se especifica como crítico para la seguridad.Por ejemplo:
[assembly: AllowPartiallyTrustedCallers]
[SecurityCritical]
class Type1 { } // Security Critical type
class Type2 // Security transparent type
{
Type1 m_field; // CA2151, transparent field of critical type
}
En este ejemplo, m_field es un campo transparente para la seguridad de un tipo que es crítico para la seguridad.
Descripción de la regla
Para utilizar tipos críticos para la seguridad, el código que hace referencia al tipo debe ser crítico para la seguridad o crítico para la seguridad y disponible desde código transparente.Esto es así incluso si la referencia es indirecta.Por ejemplo, cuando se hace referencia a un campo transparente que tiene un tipo crítico, el código debe ser crítico para la seguridad o crítico para la seguridad y disponible desde código transparente.Por consiguiente, tener un campo transparente para la seguridad o crítico para la seguridad y disponible desde código transparente puede llevar a confusión, porque el código transparente todavía no podrá tener acceso al campo.
Cómo corregir infracciones
Para corregir una infracción de esta regla, marque el campo con el atributo SecurityCriticalAttribute o convierta el tipo al que hace referencia el campo en transparente para la seguridad o crítico para la seguridad y disponible desde código transparente.
// Fix 1: Make the referencing field security critical
[assembly: AllowPartiallyTrustedCallers]
[SecurityCritical]
class Type1 { } // Security Critical type
class Type2 // Security transparent type
{
[SecurityCritical]
Type1 m_field; // Fixed: critical type, critical field
}
// Fix 2: Make the referencing field security critical
[assembly: AllowPartiallyTrustedCallers]
class Type1 { } // Type1 is now transparent
class Type2 // Security transparent type
{
[SecurityCritical]
Type1 m_field; // Fixed: critical type, critical field
}
Cuándo suprimir advertencias
No suprima las advertencias de esta regla.
Código
using System;
using System.Runtime.InteropServices;
using System.Security;
namespace TransparencyWarningsDemo
{
public class SafeNativeMethods
{
// CA2145 violation - transparent method marked SuppressUnmanagedCodeSecurity. This should be fixed by
// marking this method SecurityCritical.
[DllImport("kernel32.dll", SetLastError = true)]
[SuppressUnmanagedCodeSecurity]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool Beep(uint dwFreq, uint dwDuration);
}
}