Considerazioni sulla sicurezza in relazione alla reflectionSecurity Considerations for Reflection

La reflection consente di ottenere informazioni su tipi e membri e di accedere ai membri, vale a dire chiamare metodi e costruttori, ottenere e impostare valori di proprietà, aggiungere e rimuovere gestori eventi e così via.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'uso della reflection per ottenere informazioni su tipi e membri non presenta limitazioni.The use of reflection to obtain information about types and members is not restricted. L'intero codice può usare la reflection per eseguire le attività seguenti:All code can use reflection to perform the following tasks:

  • Enumerare tipi e membri ed esaminare i rispettivi metadati.Enumerate types and members, and examine their metadata.

  • Enumerare ed esaminare assembly e moduli.Enumerate and examine assemblies and modules.

L'uso della reflection per accedere ai membri, per contro, è soggetto a limitazioni.Using reflection to access members, by contrast, is subject to restrictions. A partire da .NET Framework 4.NET Framework 4, è possibile usare la reflection per accedere ai membri critici per la sicurezza solo tramite il codice attendibile.Beginning with the .NET Framework 4.NET Framework 4, only trusted code can use reflection to access security-critical members. Inoltre, solo un codice affidabile può usare la reflection per accedere a membri non pubblici che non sarebbero altrimenti accessibili direttamente dal codice compilato.Furthermore, only trusted code can use reflection to access nonpublic members that would not be directly accessible to compiled code. Infine, al codice in cui viene usata la reflection per accedere a un membro critico per la sicurezza devono essere associate le autorizzazioni richieste dal membro critico per la sicurezza, come nel codice compilato.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.

Fatte salve le autorizzazioni necessarie, il codice può usare la reflection per eseguire i tipi di accesso seguenti:Subject to necessary permissions, code can use reflection to perform the following kinds of access:

  • Accesso a membri pubblici non critici per la sicurezza.Access public members that are not security-critical.

  • Accesso a membri non pubblici ai quali il codice compilato potrebbe accedere, se non critici per la sicurezza.Access nonpublic members that would be accessible to compiled code, if those members are not security-critical. Gli esempi di tali membri non pubblici includono:Examples of such nonpublic members include:

    • Membri protetti delle classi base del codice chiamante.Protected members of the calling code's base classes. Nella reflection viene fatto riferimento a questa operazione con il termine accesso a livello di famiglia.(In reflection, this is referred to as family-level access.)

    • Membri internal (membri Friend in Visual Basic) nell'assembly del codice chiamante.internal members (Friend members in Visual Basic) in the calling code's assembly. Nella reflection viene fatto riferimento a questa operazione con il termine accesso a livello di assembly.(In reflection, this is referred to as assembly-level access.)

    • Membri privati di altre istanze della classe che contiene il codice chiamante.Private members of other instances of the class that contains the calling code.

Ad esempio, il codice eseguito in un dominio applicazione in modalità sandbox è limitato all'accesso descritto in questo elenco, a meno che il dominio dell'applicazione non conceda altre autorizzazioni.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.

A partire da .NET Framework 2.0 Service Pack 1.NET Framework 2.0 Service Pack 1, il tentativo di accedere a membri generalmente non accessibili genera una richiesta del set di concessioni dell'oggetto di destinazione più ReflectionPermission con il flag ReflectionPermissionFlag.MemberAccess.Starting with the .NET Framework 2.0 Service Pack 1.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. Il codice eseguito con attendibilità totale (ad esempio il codice in un'applicazione avviata dalla riga di comando) è sempre in grado di soddisfare queste autorizzazioni.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. Tale codice è soggetto a limitazioni per quanto concerne l'accesso a membri critici per la sicurezza, come descritto più avanti in questo articolo.(This is subject to limitations in accessing security-critical members, as described later in this article.)

Facoltativamente, un dominio di applicazioni sandbox può concedere ReflectionPermission con il flag ReflectionPermissionFlag.MemberAccess, come descritto nella sezione Accesso a membri generalmente non accessibili più avanti in questo articolo.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.

Accesso ai membri critici per la sicurezzaAccessing Security-Critical Members

Un membro è critico per la sicurezza se possiede l'attributo SecurityCriticalAttribute, se appartiene a un tipo che possiede l'attributo SecurityCriticalAttribute o se è contenuto in un assembly critico per la sicurezza.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. A partire da .NET Framework 4.NET Framework 4, per l'accesso ai membri critici per la sicurezza valgono le regole seguenti:Beginning with the .NET Framework 4.NET Framework 4, the rules for accessing security-critical members are as follows:

Queste regole valgono sempre, indipendentemente dal fatto che l'accesso al membro critico per la sicurezza venga eseguito direttamente dal codice compilato o tramite reflection.These rules are the same whether a security-critical member is accessed directly by compiled code, or accessed by using reflection.

Il codice dell'applicazione eseguito dalla riga di comando viene eseguito con attendibilità totale.Application code that is run from the command line runs with full trust. A condizione che non sia contrassegnato come Transparent, può usare la reflection per accedere a membri critici per la sicurezza.As long as it is not marked as transparent, it can use reflection to access security-critical members. Quando lo stesso codice viene eseguito con attendibilità parziale, ad esempio in un dominio applicazione in modalità sandbox, il livello di attendibilità dell'assembly determina se può accedere o meno a codice critico per la sicurezza: se l'assembly è dotato di un nome sicuro ed è installato nella Global Assembly Cache, si tratta di un assembly attendibile e può chiamare membri critici per la sicurezza.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. Nel caso non sia attendibile, diventa Transparent anche se non è stato contrassegnato come tale e non può accedere a membri critici per la sicurezza.If it is not trusted, it becomes transparent even though it was not marked as transparent, and it cannot access security-critical members.

Per altre informazioni sul modello di sicurezza in .NET Framework 4.NET Framework 4, vedere Security Changes (Modifiche di sicurezza).For more information about the security model in the .NET Framework 4.NET Framework 4, see Security Changes.

Reflection e trasparenzaReflection and Transparency

A partire da .NET Framework 4.NET Framework 4, Common Language Runtime determina il livello di trasparenza di un tipo o membro sulla base di diversi fattori, inclusi i livelli di attendibilità dell'assembly e del dominio dell'applicazione.Beginning with the .NET Framework 4.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 reflection fornisce le proprietà IsSecurityCritical, IsSecuritySafeCritical e IsSecurityTransparent, che consentono di individuare il livello di trasparenza di un tipo.Reflection provides the IsSecurityCritical, IsSecuritySafeCritical, and IsSecurityTransparent properties to enable you to discover the transparency level of a type. La tabella seguente illustra le combinazioni valide di queste proprietà.The following table shows the valid combinations of these properties.

Livello di sicurezzaSecurity level IsSecurityCriticalIsSecurityCritical IsSecuritySafeCriticalIsSecuritySafeCritical IsSecurityTransparentIsSecurityTransparent
CriticoCritical true false false
Critico per la sicurezzaSafe-critical true true false
TrasparenteTransparent false false true

Usare queste proprietà è molto più semplice che non esaminare le annotazioni di sicurezza di un assembly e dei suoi tipi, controllare il livello di attendibilità corrente e tentare di duplicare le regole del 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. Lo stesso tipo, ad esempio, può essere critico per la sicurezza quando viene eseguito dalla riga di comando, oppure trasparente per la sicurezza quando viene eseguito in un dominio applicazione in modalità 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.

Proprietà simili sono presenti nelle classi MethodBase, FieldInfo, TypeBuilder, MethodBuilder e DynamicMethod.There are similar properties on the MethodBase, FieldInfo, TypeBuilder, MethodBuilder, and DynamicMethod classes. Per le altre astrazioni di reflection e reflection emit, gli attributi di sicurezza vengono applicati ai metodi associati; nel caso delle proprietà, ad esempio, vengono applicati alle relative funzioni di accesso.(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.)

Accesso a membri generalmente non accessibiliAccessing Members That Are Normally Inaccessible

Per usare la reflection per richiamare membri non accessibili secondo le regole di accessibilità di Common Language Runtime, è necessario concedere al codice una delle due autorizzazioni seguenti: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:

  • Per consentire al codice di richiamare qualsiasi membro non pubblico, è necessario concedere al codice l'autorizzazione ReflectionPermission con il flag ReflectionPermissionFlag.MemberAccess.To allow code to invoke any nonpublic member:Your code must be granted ReflectionPermission with the ReflectionPermissionFlag.MemberAccess flag.

    Nota

    Per impostazione predefinita, i criteri di sicurezza negano questa autorizzazione al codice proveniente da Internet.By default, security policy denies this permission to code that originates from the Internet. L'autorizzazione, infatti, non dovrebbe mai essere concessa a codice proveniente da Internet.This permission should never be granted to code that originates from the Internet.

  • Per consentire al codice di richiamare qualsiasi membro non pubblico, a condizione che il set di concessioni dell'assembly contenente il membro richiamato sia uguale o sia un sottoinsieme del set di concessioni dell'assembly contenente il codice chiamante: è necessario concedere al codice l'autorizzazione ReflectionPermission con il flag 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.

Ad esempio, si supponga di concedere a un dominio applicazione autorizzazioni Internet più ReflectionPermission con il flag ReflectionPermissionFlag.RestrictedMemberAccess, quindi di eseguire un'applicazione Internet con due assembly, A e 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 può usare la reflection per accedere ai membri privati dell'assembly B, in quanto il set di concessioni dell'assembly B non include autorizzazioni che non siano state concesse anche ad 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 non può usare la reflection per accedere ai membri privati degli assembly di .NET Framework.NET Framework, ad esempio mscorlib.dll, poiché mscorlib.dll è completamente attendibile e pertanto ha autorizzazioni che non sono state concesse all'assembly A. Viene generata un'accezione MemberAccessException quando la sicurezza dall'accesso di codice esamina lo stack in fase di esecuzione.Assembly A cannot use reflection to access private members of .NET Framework.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.

SerializzazioneSerialization

Per la serializzazione, SecurityPermission con il flag SecurityPermissionAttribute.SerializationFormatter consente di ottenere e impostare membri di tipi serializzabili, indipendentemente dall'accessibilità.For serialization, SecurityPermission with the SecurityPermissionAttribute.SerializationFormatter flag provides the ability to get and set members of serializable types, regardless of accessibility. Questa autorizzazione consente di individuare e modificare lo stato privato di un'istanza tramite codice.This permission enables code to discover and change the private state of an instance. Oltre a disporre delle autorizzazioni appropriate, il tipo deve essere contrassegnato come serializzabile nei metadati.(In addition to being granted the appropriate permissions, the type must be marked as serializable in metadata.)

Parametri di tipo MethodInfoParameters of Type MethodInfo

È consigliabile evitare di scrivere membri pubblici che accettano parametri MethodInfo, specialmente per codice attendibile.Avoid writing public members that take MethodInfo parameters, especially for trusted code. Tali membri potrebbero risultare più vulnerabili al codice dannoso.Such members might be more vulnerable to malicious code. Si consideri ad esempio un membro pubblico in codice a elevata attendibilità che accetta un parametro MethodInfo.For example, consider a public member in highly trusted code that takes a MethodInfo parameter. Si supponga che il membro pubblico chiami indirettamente il metodo Invoke sul parametro specificato.Assume that the public member indirectly calls the Invoke method on the supplied parameter. Se il membro pubblico non esegue i controlli di autorizzazione necessari, la chiamata al metodo Invoke riuscirà sempre, poiché il sistema di sicurezza determina l'elevata attendibilità del chiamante.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. Anche se il codice dannoso non dispone dell'autorizzazione per richiamare direttamente il metodo, potrà chiamarlo indirettamente tramite una chiamata al membro pubblico.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.

Informazioni sulla versioneVersion Information

  • A partire da .NET Framework 4.NET Framework 4, il codice Transparent non può usare la reflection per accedere ai membri critici per la sicurezza.Beginning with the .NET Framework 4.NET Framework 4, transparent code cannot use reflection to access security-critical members.

  • Il flag ReflectionPermissionFlag.RestrictedMemberAccess viene introdotto in .NET Framework 2.0 Service Pack 1.NET Framework 2.0 Service Pack 1.The ReflectionPermissionFlag.RestrictedMemberAccess flag is introduced in the .NET Framework 2.0 Service Pack 1.NET Framework 2.0 Service Pack 1. Le versioni precedenti di .NET Framework.NET Framework richiedono il flag ReflectionPermissionFlag.MemberAccess per il codice che usa la reflection per accedere ai membri non pubblici.Earlier versions of the .NET Framework.NET Framework require the ReflectionPermissionFlag.MemberAccess flag for code that uses reflection to access nonpublic members. Questa autorizzazione non dovrebbe mai essere concessa al codice parzialmente attendibile.This is a permission that should never be granted to partially trusted code.

  • A partire da .NET Framework 2.0.NET Framework 2.0, l'uso della reflection per ottenere informazioni su tipi e membri non pubblici non richiede alcuna autorizzazione.Beginning with the .NET Framework 2.0.NET Framework 2.0, using reflection to obtain information about nonpublic types and members does not require any permissions. Nelle versioni precedenti è necessario usare ReflectionPermission con il flag ReflectionPermissionFlag.TypeInformation.In earlier versions, ReflectionPermission with the ReflectionPermissionFlag.TypeInformation flag is required.

Vedere ancheSee Also

ReflectionPermissionFlag
ReflectionPermission
SecurityPermission
Modifiche della sicurezzaSecurity Changes
Sicurezza dall'accesso di codiceCode Access Security
Problemi di sicurezza nella reflection emitSecurity Issues in Reflection Emit
Visualizzazione delle informazioni sul tipoViewing Type Information
Applicazione di attributiApplying Attributes
Accessing Custom Attributes (Accesso agli attributi personalizzati)Accessing Custom Attributes