Partager via


Considérations sur la sécurité de la réflexion

Offrir l'accès à des informations non publiques peut poser des problèmes de sécurité. Tout code ayant la possibilité de découvrir des informations non publiques sur un type peut potentiellement accéder à un autre code, à des données ou d'autres informations dont vous souhaitez préserver la confidentialité. Par conséquent, la sécurité .NET Framework applique des règles qui déterminent la limite d'utilisation de la réflexion pour la découverte des informations de type et l'accès aux types. En fonction de l'opération effectuée, ReflectionPermission ou SecurityPermission peuvent être requis pour la sérialisation.

Tout code peut utiliser la réflexion pour effectuer les tâches suivantes sans autorisation :

  • Obtenir des informations sur les types publics et leurs membres publics.

  • Découvrir le module et l'assembly contenant le code.

  • Énumérer les types publics.

  • Énumérer les types non publics situés dans le même assembly que le code utilisant la réflexion.

  • Énumérer les assemblys et les modules.

  • Appeler les membres publics.

  • Appeler les membres d'accès à family des classes de base du code appelant.

  • Appeler les membres d'accès à l'assembly de l'assembly du code appelant.

Pour découvrir les informations relatives aux membres non publics, les appelants doivent posséder ReflectionPermission, qui donne la possibilité d'obtenir des informations de type. Sans cette autorisation, le code ne peut pas utiliser la réflexion pour obtenir des informations sur les membres non publics (même de sa propre classe) via les méthodes Get sur Type, Assembly et Module.

Pour pouvoir utiliser la réflexion et appeler des méthodes ou accéder aux champs qui sont inaccessibles en raison des règles d'accessibilité au système de type commun (CTS, Common Type System), il faut accorder au code ReflectionPermission, afin d'autoriser l'accès au membre.

Notes

Il est recommandé que la stratégie de sécurité refuse ReflectionPermission au code provenant d'Internet.

SecurityPermission pour la sérialisation permet d'obtenir et de définir les champs de données non transitoires (c'est-à-dire les membres qui n'existent pas seulement en mémoire) des types Serializable, quelle que soit l'accessibilité. Cette autorisation permet au code de découvrir et de modifier l'état privé d'une instance. Outre le fait de disposer des autorisations appropriées, le type doit être marqué comme Serializable dans les métadonnées.

Vérifications des demandes de liens

Si une méthode ou un délégué possède LinkDemand pour une autorisation P, le runtime effectue une vérification de demande de lien par rapport à l'appelant de la méthode ou du délégué, afin de vérifier qu'il dispose de l'autorisation P. Cette vérification est effectuée aussi bien pour la découverte des informations de type que pour les appels.

Il est déconseillé d'écrire des API publiques qui utilisent les paramètres MethodInfo, en particulier pour du code d'un niveau de confiance élevé. Les autorisations risquent d'être particulièrement vulnérables face à du code nuisible. Par exemple, imaginons qu'une API publique dans du code d'un niveau de confiance élevé utilise un paramètre MethodInfo. Supposons que cette API publique appelle indirectement MethodInfo.Invoke sur le paramètre fourni. Si l'API publique n'effectue pas les vérifications d'autorisations nécessaires, l'appel à la méthode Invoke n'échoue jamais, car le système de sécurité détermine que le niveau de confiance de l'appelant est élevé. Même si un code nuisible n'a pas l'autorisation d'appeler directement la méthode, il peut toujours le faire indirectement, en appelant l'API publique.

Voir aussi

Référence

ReflectionPermissionFlag.TypeInformation
ReflectionPermissionFlag.MemberAccess
SecurityPermission

Concepts

Affichage des informations de type
Application des attributs
Accès aux attributs personnalisés