Compartir a través de


Consideraciones de seguridad referentes a la reflexión

Proporcionar acceso a la información que no es pública implica riesgos de seguridad. El código al que se permite descubrir información que no es pública en un tipo es muy probable que pueda obtener acceso a código, datos y cualquier otra información que se desee mantener privada. Por consiguiente, la seguridad de .Net Framework impone reglas que determinan hasta qué punto se puede utilizar la reflexión para descubrir información de tipo y los tipos de acceso. Dependiendo de la operación que se esté realizando, puede que se requiera un ReflectionPermission o el SecurityPermission para la serialización.

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

  • Obtener información sobre tipos públicos y los miembros públicos correspondientes.
  • Descubrir el módulo y el ensamblado en los que está el código.
  • Enumerar los tipos públicos.
  • Enumerar mediante reflexión los tipos no públicos ubicados en el mismo ensamblado que el código.
  • Enumerar ensamblados y módulos.
  • Invocar a miembros públicos.
  • Invocar a miembros de acceso de familias de las clases base del código de llamada.
  • Invocar a miembros de acceso de ensamblado del ensamblado del código de llamada.

Para descubrir información sobre los miembros no públicos, los llamadores deben disponer de la clase ReflectionPermission que representa la capacidad de obtener información de tipo. Sin dicho permiso, el código no puede utilizar la reflexión para obtener información sobre los miembros no públicos (ni siquiera de su propia clase) mediante los métodos Get en Type, Assembly y Module.

Para utilizar la reflexión a fin de invocar métodos u obtener acceso a campos que son inaccesibles según las reglas de accesibilidad del sistema de tipos comunes, es preciso conceder al código ReflectionPermission para el acceso a miembros.

**Nota   **Se recomienda que la directiva de seguridad deniegue el ReflectionPermission a código que procede de Internet.

El SecurityPermission para la serialización permite obtener y establecer cualquier campo de datos no transitorio (es decir, miembros que no sólo existen en la memoria) de tipos serializables, independientemente de la accesibilidad. Este permiso permite al código descubrir 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 delegado tiene una LinkDemand de un permiso P, el motor de tiempo de ejecución realizará una comprobación de petición de vínculo con el llamador del método o delegado para comprobar que se le ha concedido el permiso P al llamador. Esta comprobación de petición de demanda se produce para obtener información de tipo y en los casos de invocación.

Hay que evitar escribir API públicas que tomen parámetros de MethodInfo, especialmente para código de plena confianza. Los derechos de permiso pueden ser más vulnerables a código malicioso. Por ejemplo, se considera una API pública en código de plena confianza que toma un parámetro de MethodInfo. Se supone que la API pública llama indirectamente a MethodInfo.Invoke en el parámetro proporcionado. Si la API pública no realiza las comprobaciones de permiso 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.

Vea también

Ver información de tipos | ReflectionPermissionFlag.TypeInformation | ReflectionPermissionFlag.MemberAccess | SecurityPermission | Aplicar atributos | Acceso a atributos personalizados