Condividi tramite


Considerazioni sulla sicurezza in relazione alla 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. L'utilizzo della reflection per ottenere informazioni su tipi e membri non presenta limitazioni. L'intero codice può utilizzare la reflection per eseguire le seguenti attività:

  • Enumerare tipi e membri ed esaminare i rispettivi metadati.

  • Enumerare ed esaminare assembly e moduli.

L'utilizzo della reflection per accedere ai membri, per contro, è soggetto a limitazioni. A partire da .NET Framework versione 4, solo il codice attendibile può utilizzare la reflection per accedere a membri critici per la sicurezza. Inoltre, solo il codice attendibile può utilizzare la reflection per accedere a membri non pubblici a cui non è possibile accedere direttamente dal codice compilato. Infine, il codice che utilizza la reflection per accedere a un membro critico per la sicurezza deve disporre delle autorizzazioni necessarie per tale membro, come nel caso del codice compilato.

Soggetto alle autorizzazioni necessarie, il codice può utilizzare la reflection per eseguire i seguenti tipi di accesso:

  • Accesso a membri pubblici che non sono critici per la sicurezza.

  • Accesso a membri non pubblici ai quali il codice compilato potrebbe accedere, a condizione che non siano critici per la sicurezza. Gli esempi di tali membri non pubblici includono:

    • Membri protetti delle classi base del codice chiamante. Nella reflection viene fatto riferimento a questa operazione con il termine accesso a livello di famiglia.

    • Membri internal (membri Friend in Visual Basic) nell'assembly del codice chiamante. Nella reflection viene fatto riferimento a questa operazione con il termine accesso a livello di assembly.

    • Membri privati di altre istanze della classe che contiene il codice chiamante.

Ad esempio, il codice eseguito in un dominio applicazione sandbox è limitato all'accesso descritto in questo elenco, a meno che il dominio applicazione non conceda altre autorizzazioni.

A partire da .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. 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. Tale codice è soggetto a limitazioni per quanto concerne l'accesso a membri critici per la sicurezza, come descritto più avanti in questo articolo.

Facoltativamente, un dominio applicazione sandbox può concedere ReflectionPermission con il flag ReflectionPermissionFlag.MemberAccess, come descritto nella sezione Accesso a membri generalmente non accessibili, più avanti in questo articolo.

Accesso a membri critici per la sicurezza

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 partire da .NET Framework versione 4, per l'accesso ai membri critici per la sicurezza valgono le seguenti regole:

  • Il codice Transparent non può utilizzare la reflection per accedere a membri critici per la sicurezza, sebbene sia completamente attendibile. Viene generata un'eccezione MethodAccessException, FieldAccessException o TypeAccessException.

  • Il codice eseguito con attendibilità parziale è considerato Transparent.

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.

Il codice dell'applicazione eseguito dalla riga di comando viene eseguito con attendibilità totale. A condizione che non sia contrassegnato come Transparent, può utilizzare la reflection per accedere a membri critici per la sicurezza. Quando lo stesso codice viene eseguito con attendibilità parziale, ad esempio in un dominio applicazione sandbox, il livello di attendibilità dell'assembly determina se può accedere o meno a codice critico per la sicurezza: se l'assembly è dotato di nome sicuro ed è installato nella Global Assembly Cache, si tratta di un assembly attendibile e può chiamare membri critici per la sicurezza. Nel caso non sia attendibile, diventa Transparent anche se non è stato contrassegnato come tale e non può accedere a membri critici per la sicurezza.

Per ulteriori informazioni sul modello di sicurezza in .NET Framework 4, vedere Modifiche della sicurezza in .NET Framework 4.

Reflection e trasparenza

A partire da .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 applicazione. La reflection fornisce le proprietà IsSecurityCritical, IsSecuritySafeCritical e IsSecurityTransparent, che consentono di individuare il livello di trasparenza di un tipo. Nella tabella che segue sono illustrate le combinazioni valide di queste proprietà.

Livello di sicurezza

IsSecurityCritical

IsSecuritySafeCritical

IsSecurityTransparent

Livello critico

true

false

false

Critico per la sicurezza

true

true

false

Trasparente

false

false

true

Utilizzare queste proprietà è molto più semplice che non esaminare le annotazioni di sicurezza di un assembly e dei relativi tipi, controllare il livello di attendibilità corrente e tentare di duplicare le regole del runtime. 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 sandbox.

Proprietà simili sono presenti nelle classi MethodBase, FieldInfo, TypeBuilder, MethodBuilder e DynamicMethod. 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.

Accesso a membri generalmente non accessibili

Per utilizzare 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:

  • Per consentire al codice di richiamare qualsiasi membro non pubblico: è necessario concedere al codice l'autorizzazione ReflectionPermission con il flag ReflectionPermissionFlag.MemberAccess.

    NotaNota

    Per impostazione predefinita, il criterio di sicurezza nega questa autorizzazione a codice proveniente da Internet.Tale autorizzazione, infatti, non dovrebbe mai essere concessa a codice proveniente da 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.

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.

  • L'assembly A può utilizzare la reflection per accedere ai membri privati dell'assembly B, in quanto la concessione dell'assembly B non include autorizzazioni che non siano state concesse anche ad A.

  • L'assembly A non può utilizzare la reflection per accedere ai membri privati degli assembly di .NET Framework, ad esempio mscorlib.dll, poiché mscorlib.dll è completamente attendibile e pertanto dispone di autorizzazioni che non sono state concesse all'assembly A. Quando il percorso chiamate nello stack viene verificato dalla sicurezza dall'accesso di codice in fase di esecuzione, viene generata un'eccezione MemberAccessException.

Serializzazione

Per la serializzazione SecurityPermission con il flag SecurityPermissionAttribute.SerializationFormatter consente di ottenere e impostare membri di tipi serializzabili, indipendentemente dall'accessibilità. Questa autorizzazione consente di individuare e modificare lo stato privato di un'istanza tramite codice. Oltre a disporre delle autorizzazioni appropriate, il tipo deve essere contrassegnato come serializzabile nei metadati.

Parametri di tipo MethodInfo

È consigliabile evitare di scrivere membri pubblici che accettano parametri MethodInfo, specialmente per codice attendibile. Tali membri potrebbero risultare più vulnerabili al codice dannoso. Si consideri ad esempio un membro pubblico in codice a elevata attendibilità che accetta un parametro MethodInfo. Si supponga che il membro pubblico chiami indirettamente il metodo Invoke sul parametro specificato. 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. Anche se il codice dannoso non dispone dell'autorizzazione per richiamare direttamente il metodo, potrà chiamarlo indirettamente tramite una chiamata al membro pubblico.

Informazioni sulla versione

  • A partire da .NET Framework versione 4, il codice Transparent non può utilizzare la reflection per accedere ai membri critici per la sicurezza.

  • Il flag ReflectionPermissionFlag.RestrictedMemberAccess viene introdotto in .NET Framework 2.0 Service Pack 1. Le versioni precedenti di .NET Framework richiedono il flag ReflectionPermissionFlag.MemberAccess per il codice che utilizza la reflection per accedere ai membri non pubblici. Questa autorizzazione non dovrebbe mai essere concessa al codice a elevata attendibilità.

  • A partire da .NET Framework 2.0 l'utilizzo della reflection per ottenere informazioni su tipi e membri non pubblici non richiede alcuna autorizzazione. Nelle versioni precedenti è necessario utilizzare ReflectionPermission con il flag ReflectionPermissionFlag.TypeInformation.

Vedere anche

Riferimenti

ReflectionPermissionFlag

ReflectionPermission

SecurityPermission

Concetti

Modifiche della sicurezza in .NET Framework 4

Sicurezza dall'accesso di codice

Problemi di sicurezza nella reflection emit

Visualizzazione delle informazioni sul tipo

Applicazione di attributi

Accesso ad attributi personalizzati