Considerazioni sulla sicurezza in relazione alla riflessione

Aggiornamento: novembre 2007

La riflessione consente di ottenere informazioni su tipi e membri e accedere a membri. L'accesso a membri non pubblici potrebbe creare un problema di sicurezza, pertanto il codice che accede a membri non pubblici richiede l'utilizzo di ReflectionPermission con i flag appropriati. Inoltre per alcune attività, ad esempio fornire evidenza, eseguire codice non gestito e serializzare oggetti, è necessario utilizzare SecurityPermission.

Nel codice è possibile utilizzare la reflection per le seguenti attività senza autorizzazioni:

  • Enumerare tipi e membri ed esaminare i rispettivi metadati.

  • Enumerare ed esaminare assembly e moduli.

  • Accedere a membri pubblici.

  • Accedere a membri protected delle classi base del codice chiamante. Nella riflessione viene fatto riferimento a questa operazione con il termine accesso a livello di famiglia.

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

Accesso a membri non pubblici

Per utilizzare la riflessione 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: ReflectionPermission con il flag ReflectionPermissionFlag.MemberAccess.

    Nota:

    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 la concessione dell'assembly contenente il membro richiamato sia la stessa o un sottoinsieme della concessione dell'assembly contenente il codice che richiama il metodo: 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 riflessione 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 riflessione per accedere ai membri privati degli assembly .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.

Per un esempio di dominio applicazione creato mediante sandbox che concede ReflectionPermission con il flag ReflectionPermissionFlag.RestrictedMemberAccess, vedere Procedura dettagliata: emissione di codice in scenari di attendibilità parziale.

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.

Controlli di richiesta di collegamento

Se a un metodo o un delegato è associata una LinkDemand per l'autorizzazione P, il runtime eseguirà un controllo della richiesta di collegamento sul chiamante del metodo o del delegato per verificare che al chiamante sia stata concessa l'autorizzazione P. Il controllo della richiesta di collegamento viene effettuato sia per l'individuazione delle informazioni sul tipo che per la chiamata.

Evitare di creare parametri di tipo MethodInfo

È consigliabile evitare di scrivere API pubbliche che accettano parametri MethodInfo, in particolare per codice a elevata attendibilità. Tali API potrebbero risultare più vulnerabili al codice dannoso. Si consideri ad esempio un'API pubblica in un segmento di codice a elevata attendibilità che accetta un parametro MethodInfo. Si supponga che l'API pubblica chiami indirettamente il metodo Invoke sul parametro fornito. Se dall'API pubblica non vengono eseguiti i controlli di autorizzazione necessari, la chiamata al metodo Invoke riuscirà comunque, perché il sistema di sicurezza determina l'elevata attendibilità del chiamante. Anche se il codice dannoso non dispone dell'autorizzazione per richiamare il metodo direttamente, potrà chiamarlo indirettamente tramite una chiamata dell'API pubblica.

Informazioni sulla versione

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 riflessione per accedere ai membri non pubblici. Questa autorizzazione non dovrebbe mai essere concessa al codice a elevata attendibilità.

Nota:

Per utilizzare il flag ReflectionPermissionFlag.RestrictedMemberAccess, l'applicazione deve essere indirizzata a .NET Framework versione 3.5. Per ulteriori informazioni, vedere Architettura di .NET Framework 3.5.

A partire da .NET Framework 2.0 l'utilizzo della riflessione 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

Concetti

Problemi di sicurezza con la reflection emit

Visualizzazione delle informazioni sul tipo

Applicazione di attributi

Accesso ad attributi personalizzati

Riferimenti

ReflectionPermissionFlag

ReflectionPermission

SecurityPermission