Restrizioni relative al modello di programmazione dell'integrazione con CLR
Quando si compila una stored procedure gestita o altri oggetti di database gestiti, è necessario tenere conto di alcuni controlli del codice eseguiti da SQL Server. Alla prima registrazione nel database, e anche in fase di esecuzione, in SQL Server vengono eseguiti dei controlli sull'assembly del codice gestito mediante l'istruzione CREATE ASSEMBLY. Il controllo del codice gestito viene effettuato anche in fase di esecuzione in quanto è possibile che in un assembly siano presenti percorsi di codice mai raggiunti in questa fase. Tale controllo offre quindi la flessibilità necessaria per registrare soprattutto assembly di terze parti, in modo da evitare che un assembly venga bloccato in presenza di codice considerato poco sicuro, progettato per essere eseguito in un ambiente client, ma mai nel CLR hosted. Di seguito sono riportati i requisiti che il codice gestito deve soddisfare. Essi variano a seconda che l'assembly sia registrato come SAFE, EXTERNAL_ACCESS o UNSAFE, SAFE (il più rigoroso).
Oltre alle restrizioni inserite negli assembly del codice gestito, vengono concesse anche delle autorizzazioni di sicurezza da accesso di codice. Common Language Runtime (CLR) supporta un modello di sicurezza definito sicurezza dall'accesso di codice per il codice gestito che prevede che le autorizzazioni vengano concesse agli assembly in base all'identità del codice. Gli assembly SAFE, EXTERNAL_ACCESS e UNSAFE presentano autorizzazioni di protezione dall'accesso di codice diverse. Per ulteriori informazioni, vedere Sicurezza da accesso di codice dell'integrazione con CLR.
Controlli CREATE ASSEMBLY
Durante l'esecuzione dell'istruzione CREATE ASSEMBLY, per ogni livello di sicurezza vengono eseguiti i controlli seguenti. Se un controllo non riesce, non è possibile completare l'esecuzione di CREATE ASSEMBLY e viene visualizzato un messaggio di errore.
Globale (qualsiasi livello di sicurezza)
Tutti gli assembly a cui si fa riferimento devono soddisfare uno o più dei criteri seguenti:
L'assembly è già registrato nel database.
L'assembly è uno degli assembly supportati. Per ulteriori informazioni, vedere Librerie .NET Framework supportate.
Si sta utilizzando CREATE ASSEMBLY FROM<location>, e tutti gli assembly di riferimento e le relative dipendenze sono disponibili in <location>.
Si sta utilizzando CREATE ASSEMBLY FROM<bytes …>, e tutti i riferimenti vengono specificati tramite byte separati da spazi.
EXTERNAL_ACCESS
Tutti gli assembly EXTERNAL_ACCESS devono soddisfare i criteri seguenti:
I campi statici non vengono utilizzati per archiviare informazioni. Sono consentiti campi statici di sola lettura.
Il test di PEVerify viene superato. Lo strumento PEVerify (peverify.exe) che verifica che il codice MSIL e i metadati associati soddisfino i requisiti di indipendenza dai tipi, viene fornito insieme a .NET Framework SDK.
La sincronizzazione, ad esempio con la classe SynchronizationAttribute, non viene utilizzata.
I metodi del finalizzatore non vengono utilizzati.
Gli attributi personalizzati seguenti non sono consentiti negli assembly EXTERNAL_ACCESS:
System.ContextStaticAttribute
System.MTAThreadAttribute
System.Runtime.CompilerServices.MethodImplAttribute
System.Runtime.CompilerServices.CompilationRelaxationsAttribute
System.Runtime.Remoting.Contexts.ContextAttribute
System.Runtime.Remoting.Contexts.SynchronizationAttribute
System.Runtime.InteropServices.DllImportAttribute
System.Security.Permissions.CodeAccessSecurityAttribute
System.Security.SuppressUnmanagedCodeSecurityAttribute
System.Security.UnverifiableCodeAttribute
System.STAThreadAttribute
System.ThreadStaticAttribute
SAFE
- Tutte le condizioni dell'assembly EXTERNAL_ACCESS vengono controllate.
Controlli runtime
In fase di esecuzione l'assembly del codice viene esaminato per verificare la presenza delle condizioni riportate di seguito. Se ne viene riscontrata una, non verrà consentita l'esecuzione del codice gestito e sarà generata un'eccezione.
UNSAFE
Il caricamento di un assembly, in modo esplicito mediante la chiamata del metodo System.Reflection.Assembly.Load() da una matrice di byte o in modo implicito attraverso l'utilizzo dello spazio dei nomi Reflection.Emit, non è consentito.
EXTERNAL_ACCESS
Tutte le condizioni di UNSAFE vengono controllate.
Tutti i tipi e i metodi annotati con i valori dell'attributo di protezione host riportati di seguito dell'elenco supportato di assembly non sono consentiti.
SelfAffectingProcessMgmt
SelfAffectingThreading
Synchronization
SharedState
ExternalProcessMgmt
ExternalThreading
SecurityInfrastructure
MayLeakOnAbort
UI
Per ulteriori informazioni sugli attributi di protezione host e un elenco di tipi e membri non consentiti negli assembly supportati, vedere Attributi di protezione host e programmazione dell'integrazione con CLR.
SAFE
Tutte le condizioni di EXTERNAL_ACCESS vengono controllate.