Considérations sur la sécurité de la réflexionSecurity Considerations for Reflection

La réflexion permet d'obtenir des informations sur les types et les membres, et d'accéder aux membres (c'est-à-dire appeler des méthodes et des constructeurs, obtenir et définir des valeurs de propriétés, ajouter et supprimer des gestionnaires d'événements, etc.).Reflection provides the ability to obtain information about types and members, and to access members (that is, to call methods and constructors, to get and set property values, to add and remove event handlers, and so on). L'utilisation de la réflexion pour obtenir des informations sur les types et les membres n'est pas limitée.The use of reflection to obtain information about types and members is not restricted. Tout code peut utiliser la réflexion pour effectuer les tâches suivantes :All code can use reflection to perform the following tasks:

  • Énumérer les types et les membres, et examiner leurs métadonnées.Enumerate types and members, and examine their metadata.

  • Énumérer et examiner les assemblys et les modules.Enumerate and examine assemblies and modules.

En revanche, l'utilisation de la réflexion pour accéder aux membres est soumise à des restrictions.Using reflection to access members, by contrast, is subject to restrictions. À compter de .NET Framework 4, seul le code de confiance peut utiliser la réflexion pour accéder aux membres critiques de sécurité.Beginning with the .NET Framework 4, only trusted code can use reflection to access security-critical members. En outre, seul le code de confiance peut utiliser la réflexion pour accéder aux membres non publics qui ne seraient pas directement accessibles au code compilé.Furthermore, only trusted code can use reflection to access nonpublic members that would not be directly accessible to compiled code. Enfin, le code qui utilise la réflexion pour accéder à un membre critique sécurisé doit avoir les autorisations demandées par ce membre, tout comme avec le code compilé.Finally, code that uses reflection to access a safe-critical member must have whatever permissions the safe-critical member demands, just as with compiled code.

Moyennant les autorisations nécessaires, le code peut utiliser la réflexion pour effectuer les types d'accès suivants :Subject to necessary permissions, code can use reflection to perform the following kinds of access:

  • Accès aux membres publics qui ne sont pas critiques de sécurité.Access public members that are not security-critical.

  • Accès aux membres non publics qui seraient accessibles au code compilé, si ces membres ne sont pas critiques de sécurité.Access nonpublic members that would be accessible to compiled code, if those members are not security-critical. Voici des exemples de ces membres non publics :Examples of such nonpublic members include:

    • Membres protégés des classes de base du code appelant.Protected members of the calling code's base classes. (Dans la réflexion, ceci s'appelle l'accès au niveau de la famille.)(In reflection, this is referred to as family-level access.)

    • Membres internal (les membres Friend en Visual Basic) de l'assembly du code appelant.internal members (Friend members in Visual Basic) in the calling code's assembly. (Dans la réflexion, ceci s'appelle l'accès au niveau de l'assembly.)(In reflection, this is referred to as assembly-level access.)

    • Membres privés d'autres instances de la classe qui contient le code appelant.Private members of other instances of the class that contains the calling code.

Par exemple, le code qui est exécuté dans un domaine d'application sandbox est limité aux accès décrits dans cette liste, sauf si le domaine d'application accorde des autorisations supplémentaires.For example, code that is run in a sandboxed application domain is limited to the access described in this list, unless the application domain grants additional permissions.

À compter de .NET Framework 2.0 Service Pack 1, le fait de tenter d’accéder à des membres normalement inaccessibles génère une demande du jeu d’autorisations de l’objet cible, plus ReflectionPermission avec l’indicateur ReflectionPermissionFlag.MemberAccess.Starting with the .NET Framework 2.0 Service Pack 1, attempting to access members that are normally inaccessible generates a demand for the grant set of the target object plus ReflectionPermission with the ReflectionPermissionFlag.MemberAccess flag. Un code qui s’exécute avec un niveau de confiance total (par exemple, le code d’une application lancée à partir de la ligne de commande) peut toujours satisfaire à ces autorisations.Code that is running with full trust (for example, code in an application that is launched from the command line) can always satisfy these permissions. (Ceci est soumis aux limitations de l'accès aux membres critiques de sécurité, comme décrit plus loin dans cet article.)(This is subject to limitations in accessing security-critical members, as described later in this article.)

De façon facultative, un domaine d’application sandbox peut accorder ReflectionPermission avec l’indicateur ReflectionPermissionFlag.MemberAccess, comme décrit dans la section Accès aux membres normalement inaccessibles plus loin dans cet article.Optionally, a sandboxed application domain can grant ReflectionPermission with the ReflectionPermissionFlag.MemberAccess flag, as described in the section Accessing Members That Are Normally Inaccessible, later in this article.

Accès aux membres critiques de sécuritéAccessing Security-Critical Members

Un membre est critique du point de vue de la sécurité s'il a l'attribut SecurityCriticalAttribute, s'il appartient à un type qui a l'attribut SecurityCriticalAttribute ou s'il est dans un assembly critique du point de vue de la sécurité.A member is security-critical if it has the SecurityCriticalAttribute, if it belongs to a type that has the SecurityCriticalAttribute, or if it is in a security-critical assembly. À compter de .NET Framework 4, les règles d’accès aux membres critiques de sécurité sont les suivantes :Beginning with the .NET Framework 4, the rules for accessing security-critical members are as follows:

  • Le code transparent ne peut pas utiliser la réflexion pour accéder aux membres critiques de sécurité, même si le code est d'un niveau de confiance total.Transparent code cannot use reflection to access security-critical members, even if the code is fully trusted. Une exception MethodAccessException, FieldAccessException ou TypeAccessException est levée.A MethodAccessException, FieldAccessException, or TypeAccessException is thrown.

  • Le code qui s'exécute avec un niveau de confiance partiel est traité comme étant transparent.Code that is running with partial trust is treated as transparent.

Ces règles sont les mêmes si l'accès à un membre critique du point de vue de la sécurité se fait directement par du code compilé ou en utilisant la réflexion.These rules are the same whether a security-critical member is accessed directly by compiled code, or accessed by using reflection.

Le code d'application qui est exécuté à partir de la ligne de commande s'exécute avec une confiance totale.Application code that is run from the command line runs with full trust. Tant qu'il n'est pas marqué comme transparent, il peut utiliser la réflexion pour accéder aux membres critiques de sécurité.As long as it is not marked as transparent, it can use reflection to access security-critical members. Quand le même code est exécuté avec un niveau de confiance partiel (par exemple dans un domaine d'application sandbox), le niveau de confiance de l'assembly détermine s'il peut accéder au code critique du point de vue de la sécurité. Si l'assembly a un nom fort et qu'il est installé dans le Global Assembly Cache, c'est un assembly de confiance et il peut appeler des membres critiques de sécurité.When the same code is run with partial trust (for example, in a sandboxed application domain) the assembly's trust level determines whether it can access security-critical code: If the assembly has a strong name and is installed in the global assembly cache, it is a trusted assembly and can call security-critical members. Si elle n'est pas de confiance, il devient transparent même s'il n'était pas marqué comme tel, et il ne peut pas accéder aux membres critiques de sécurité.If it is not trusted, it becomes transparent even though it was not marked as transparent, and it cannot access security-critical members.

Pour plus d’informations sur le modèle de sécurité dans .NET Framework 4, consultez Changements relatifs à la sécurité.For more information about the security model in the .NET Framework 4, see Security Changes.

Réflexion et transparenceReflection and Transparency

Depuis .NET Framework 4, le common language runtime détermine le niveau de transparence d’un type ou d’un membre à partir de plusieurs facteurs, notamment le niveau de confiance de l’assembly et le niveau de confiance du domaine d’application.Beginning with the .NET Framework 4, the common language runtime determines the transparency level of a type or member from several factors, including the trust level of the assembly and the trust level of the application domain. La réflexion fournit les propriétés IsSecurityCritical, IsSecuritySafeCritical et IsSecurityTransparent pour vous permettre de connaître le niveau de transparence d'un type.Reflection provides the IsSecurityCritical, IsSecuritySafeCritical, and IsSecurityTransparent properties to enable you to discover the transparency level of a type. Le tableau suivant montre les combinaisons valides de ces propriétés.The following table shows the valid combinations of these properties.

Niveau de sécuritéSecurity level EstCritiqueDeSécuritéIsSecurityCritical EstCritiqueSécuriséIsSecuritySafeCritical EstTransparentDeSécuritéIsSecurityTransparent
CriticalCritical true false false
Critique sécuriséSafe-critical true true false
TransparentTransparent false false true

L'utilisation de ces propriétés est beaucoup plus simple que d'examiner les annotations de sécurité d'un assembly et ses types, de vérifier le niveau de confiance actuel et de tenter de dupliquer les règles du runtime.Using these properties is much simpler than examining the security annotations of an assembly and its types, checking the current trust level, and attempting to duplicate the runtime's rules. Par exemple, un même type peut être critique du point de vue de la sécurité quand il est exécuté à partir de la ligne de commande ou il peut être transparent de sécurité quand il est exécuté dans un domaine d'application sandbox.For example, the same type can be security-critical when it is run from the command line, or security-transparent when it is run in a sandboxed application domain.

Il existe des propriétés similaires sur les classes MethodBase, FieldInfo, TypeBuilder, MethodBuilder et DynamicMethod.There are similar properties on the MethodBase, FieldInfo, TypeBuilder, MethodBuilder, and DynamicMethod classes. (Pour d'autres abstractions de réflexion et d'émission de réflexion, des attributs de sécurité sont appliqués aux méthodes associées ; par exemple, dans le cas des propriétés, ils sont appliqués aux accesseurs de propriété.)(For other reflection and reflection emit abstractions, security attributes are applied to the associated methods; for example, in the case of properties they are applied to the property accessors.)

Accès aux membres qui sont normalement inaccessiblesAccessing Members That Are Normally Inaccessible

Pour utiliser la réflexion pour appeler des membres inaccessibles en fonction des règles d'accessibilité du common language runtime, votre code doit disposer de l'une des deux autorisations suivantes :To use reflection to invoke members that are inaccessible according to the accessibility rules of the common language runtime, your code must be granted one of two permissions:

  • Pour permettre au code d’appeler un membre non public : votre code doit disposer de l’autorisation ReflectionPermission avec l’indicateur ReflectionPermissionFlag.MemberAccess.To allow code to invoke any nonpublic member:Your code must be granted ReflectionPermission with the ReflectionPermissionFlag.MemberAccess flag.

    Notes

    Par défaut, la stratégie de sécurité refuse cette autorisation à du code provenant d'Internet.By default, security policy denies this permission to code that originates from the Internet. Cette autorisation ne doit jamais être accordée à du code provenant d'Internet.This permission should never be granted to code that originates from the Internet.

  • Pour permettre au code d'appeler un membre non public, pour autant que le jeu d'autorisations de l'assembly qui contient le membre appelé soit l'équivalent ou un sous-ensemble du jeu d'autorisations de l'assembly qui contient l'appel de code : votre code doit disposer de l'autorisation ReflectionPermission avec l'indicateur ReflectionPermissionFlag.RestrictedMemberAccess.To allow code to invoke any nonpublic member, as long as the grant set of the assembly that contains the invoked member is the same as, or a subset of, the grant set of the assembly that contains the invoking code: Your code must be granted ReflectionPermission with the ReflectionPermissionFlag.RestrictedMemberAccess flag.

Par exemple, supposons que vous accordez des autorisations Internet à un domaine d'application, plus l'autorisation ReflectionPermission avec l'indicateur ReflectionPermissionFlag.RestrictedMemberAccess, puis que vous exécutez une application Internet avec deux assemblys, A et B.For example, suppose you grant an application domain Internet permissions plus ReflectionPermission with the ReflectionPermissionFlag.RestrictedMemberAccess flag, and then run an Internet application with two assemblies, A and B.

  • L'assembly A peut utiliser la réflexion pour accéder aux membres privés de l'assembly B, car le jeu d'autorisations de l'assembly B n'inclut pas d'autorisations qui n'ont pas été accordées à A.Assembly A can use reflection to access private members of assembly B, because the grant set of assembly B does not include any permissions that A has not been granted.

  • L’assembly A ne peut pas utiliser la réflexion pour accéder aux membres privés des assemblys du .NET Framework, comme mscorlib.dll, car mscorlib.dll est d’un niveau de confiance total et dispose donc d’autorisations qui n’ont pas été accordées à l’assembly A. Une exception MemberAccessException est levée quand la sécurité d’accès du code parcourt la pile au moment de l’exécution.Assembly A cannot use reflection to access private members of .NET Framework assemblies such as mscorlib.dll, because mscorlib.dll is fully trusted and therefore has permissions that have not been granted to assembly A. A MemberAccessException is thrown when code access security walks the stack at run time.

SérialisationSerialization

Pour la sérialisation, l'autorisation SecurityPermission avec l'indicateur SecurityPermissionAttribute.SerializationFormatter permet d'obtenir et de définir des membres des types sérialisables, indépendamment de l'accessibilité.For serialization, SecurityPermission with the SecurityPermissionAttribute.SerializationFormatter flag provides the ability to get and set members of serializable types, regardless of accessibility. Cette autorisation permet au code de découvrir et de changer l'état privé d'une instance.This permission enables code to discover and change the private state of an instance. (En plus de disposer des autorisations appropriées, le type doit être marqué comme étant sérialisable dans les métadonnées.)(In addition to being granted the appropriate permissions, the type must be marked as serializable in metadata.)

Paramètres de type MethodInfoParameters of Type MethodInfo

Évitez d'écrire des membres publics qui prennent des paramètres MethodInfo, en particulier pour du code de confiance.Avoid writing public members that take MethodInfo parameters, especially for trusted code. Ces membres peuvent être plus vulnérables au code malveillant.Such members might be more vulnerable to malicious code. Par exemple, considérez un membre public dans du code d'un niveau de confiance élevé qui prend un paramètre MethodInfo.For example, consider a public member in highly trusted code that takes a MethodInfo parameter. Supposons que ce membre public appelle indirectement la méthode Invoke sur le paramètre fourni.Assume that the public member indirectly calls the Invoke method on the supplied parameter. Si le membre public n'effectue pas les vérifications d'autorisations nécessaires, l'appel à la méthode Invoke réussit toujours, car le système de sécurité détermine que l'appelant est d'un niveau de confiance élevé.If the public member does not perform the necessary permission checks, the call to the Invoke method will always succeed, because the security system determines that the caller is highly trusted. Même si un code malveillant n'a pas l'autorisation d'appeler directement la méthode, il peut néanmoins le faire indirectement en appelant le membre public.Even if malicious code does not have the permission to directly invoke the method, it can still do so indirectly by calling the public member.

Informations sur la versionVersion Information

  • À compter de .NET Framework 4, le code transparent ne peut pas utiliser la réflexion pour accéder aux membres critiques de sécurité.Beginning with the .NET Framework 4, transparent code cannot use reflection to access security-critical members.

  • L’indicateur ReflectionPermissionFlag.RestrictedMemberAccess a été introduit dans .NET Framework 2.0 Service Pack 1.The ReflectionPermissionFlag.RestrictedMemberAccess flag is introduced in the .NET Framework 2.0 Service Pack 1. Les versions antérieures du .NET Framework exigent l’indicateur ReflectionPermissionFlag.MemberAccess pour le code qui utilise la réflexion pour accéder aux membres non publics.Earlier versions of the .NET Framework require the ReflectionPermissionFlag.MemberAccess flag for code that uses reflection to access nonpublic members. Il s'agit d'une autorisation qui ne doit jamais être accordée à du code d'un niveau de confiance partiel.This is a permission that should never be granted to partially trusted code.

  • Depuis .NET Framework 2.0, l’utilisation de la réflexion pour obtenir des informations sur les types et les membres non publics ne nécessite aucune autorisation.Beginning with the .NET Framework 2.0, using reflection to obtain information about nonpublic types and members does not require any permissions. Dans les versions antérieures, l’autorisation ReflectionPermission avec l’indicateur ReflectionPermissionFlag.TypeInformation est exigée.In earlier versions, ReflectionPermission with the ReflectionPermissionFlag.TypeInformation flag is required.

Voir aussiSee also