Compartir a través de


Consideraciones de seguridad sobre la reflexión

Actualización: noviembre 2007

La reflexión proporciona la capacidad de obtener información sobre los tipos y miembros y de obtener acceso a los miembros. El acceso a miembros no públicos puede constituir un riesgo para la seguridad. Por consiguiente, el código que tiene acceso a miembros no públicos necesita disponer de permisos ReflectionPermission con los marcadores adecuados. Asimismo, en algunas tareas se requieren permisos SecurityPermission, por ejemplo, al proporcionar evidencias, al ejecutar código no administrado y al serializar objetos.

Todo código puede utilizar la reflexión para llevar a cabo las siguientes tareas sin ningún tipo de permiso:

  • Enumerar tipos y miembros y examinar sus metadatos.

  • Enumerar y examinar ensamblados y módulos.

  • Obtener acceso a miembros públicos.

  • Obtener acceso a miembros protected de las clases base del código de llamada. (En reflexión, esto se conoce como acceso de nivel familiar).

  • Obtener acceso a miembros internal (miembros Friend en Visual Basic) del ensamblado del código de llamada. (En reflexión, esto se conoce como acceso de nivel de ensamblado).

Acceso a miembros no públicos

Si desea utilizar la reflexión para invocar miembros a los que no se puede tener acceso conforme a las reglas de accesibilidad de Common Language Runtime, el código debe disponer de uno de estos dos permisos:

  • Para permitir que el código invoque miembros no públicos: el permiso ReflectionPermission con el marcador ReflectionPermissionFlag.MemberAccess.

    Nota:

    De forma predeterminada, la directiva de seguridad deniega este permiso al código que se origina en Internet. Este permiso nunca debería concederse al código que se origina en Internet.

  • Para permitir que el código invoque miembros no públicos, siempre y cuando el conjunto de permisos concedidos del ensamblado que contiene el miembro invocado sea igual que el conjunto de permisos concedidos del ensamblado que contiene el código que se invoca (o un subconjunto de éste): el permiso ReflectionPermission con el marcador ReflectionPermissionFlag.RestrictedMemberAccess.

Por ejemplo, suponga que concede a un dominio de aplicación permisos de Internet además de permisos ReflectionPermission con el marcador ReflectionPermissionFlag.RestrictedMemberAccess y, a continuación, ejecuta una aplicación de Internet con dos ensamblados, A y B.

  • El ensamblado A puede utilizar la reflexión para tener acceso a los miembros privados del ensamblado B, ya que el conjunto de permisos concedidos del ensamblado B no contiene ningún permiso que no se le haya concedido a A.

  • El ensamblado A no puede utilizar la reflexión para tener acceso a los miembros privados de los ensamblados de .NET Framework, por ejemplo mscorlib.dll, porque mscorlib.dll es de plena confianza y, por tanto, tiene permisos que no se le han concedido al ensamblado A. Se produce una excepción MemberAccessException cuando la seguridad de acceso del código recorre la pila en tiempo de ejecución.

Para obtener un ejemplo de un dominio de aplicación en un recinto de seguridad que conceda el permiso ReflectionPermission con el marcador ReflectionPermissionFlag.RestrictedMemberAccess, vea Tutorial: Emitir código en escenarios que no son de plena confianza.

Serialización

En la serialización, el permiso SecurityPermission con el marcador SecurityPermissionAttribute.SerializationFormatter proporciona la capacidad de obtener y establecer miembros de tipos serializables, sin tener en cuenta la accesibilidad. Este permiso permite al código detectar y cambiar el estado privado de una instancia. (Además de tener concedidos los permisos apropiados, se debe marcar el tipo como serializable en los metadatos).

Comprobaciones de solicitud de vínculo

Si un método o un delegado cuenta con un LinkDemand para un tipo de permiso P, el motor en tiempo de ejecución realizará una comprobación de la petición del vínculo en el llamador del método o el delegado para asegurarse de que se ha concedido el permiso P al llamador. Esta comprobación de la petición del vínculo se produce tanto para la detección de información de tipos como para la invocación.

Impedir la creación de parámetros de tipo MethodInfo

Hay que evitar escribir API públicas que tomen parámetros MethodInfo, especialmente en el código de plena confianza. Estas API podrían ser más vulnerables al código malintencionado. Por ejemplo, imagine una API pública en un código de plena confianza que tome un parámetro MethodInfo. Suponga que la API pública llama indirectamente al método Invoke en el parámetro proporcionado. Si la API pública no realiza las comprobaciones de permisos necesarias, la llamada al método Invoke se realizará siempre correctamente, ya que el sistema de seguridad determina que el llamador es de plena confianza. Incluso si hay código malicioso sin permiso para invocar directamente al método, lo podrá hacer indirectamente llamando a la API pública.

Información de versiones

El marcador ReflectionPermissionFlag.RestrictedMemberAccess se incluye en .NET Framework versión 2.0 Service Pack 1. Las versiones anteriores de .NET Framework necesitan el marcador ReflectionPermissionFlag.MemberAccess en el código que utiliza la reflexión para tener acceso a los miembros no públicos. Éste es un permiso que nunca debe concederse al código de confianza parcial.

Nota:

Para utilizar el marcador ReflectionPermissionFlag.RestrictedMemberAccess, el destino de la aplicación debe ser .NET Framework versión 3.5. Para obtener más información, vea Arquitectura de .NET Framework 3.5.

A partir de .NET Framework 2.0, ya no es necesario ningún permiso cuando se utiliza la reflexión para obtener información de tipos y miembros no públicos. En versiones anteriores, se necesitaba el permiso ReflectionPermission con el marcador ReflectionPermissionFlag.TypeInformation.

Vea también

Conceptos

Problemas de seguridad en la emisión de la reflexión

Ver información de tipos

Aplicar atributos

Acceso a atributos personalizados

Referencia

ReflectionPermissionFlag

ReflectionPermission

SecurityPermission