Restrizioni relative al modello di programmazione dell'integrazione con CLR
Quando si compila una stored procedure gestita o un altro oggetto di database gestito, esistono determinati controlli del codice eseguiti da SQL Server esegue controlli sull'assembly del codice gestito quando viene registrato per la prima volta nel database, usando l'istruzione CREATE ASSEMBLY
e anche in fase di esecuzione. 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. I requisiti che il codice gestito deve soddisfare dipendono dal fatto che l'assembly sia registrato come SAFE
, EXTERNAL_ACCESS
o UNSAFE
, SAFE
sia il più rigoroso e siano elencati di seguito.
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 altre informazioni, vedere Sicurezza dall'accesso al codice di integrazione 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 altre informazioni, vedere Librerie .NET Framework supportate.
Si usa
CREATE ASSEMBLY FROM
<il percorso> e tutti gli assembly a cui si fa riferimento e le relative dipendenze sono disponibili nel <percorso>.Si usano
CREATE ASSEMBLY FROM
<byte ...> 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 chiamando il System.Reflection.Assembly.Load()
metodo da una matrice di byte o in modo implicito tramite l'uso dello Reflection.Emit
spazio dei nomi 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
Sincronizzazione
SharedState
ExternalProcessMgmt
ExternalThreading
SecurityInfrastructure
MayLeakOnAbort
Interfaccia utente
Per altre informazioni sugli HPA e un elenco di tipi e membri non consentiti negli assembly supportati, vedere Attributi di protezione host e programmazione di integrazione CLR.
SAFE
Tutte le condizioni di EXTERNAL_ACCESS
vengono controllate.
Vedere anche
Librerie .NET Framework supportate
Sicurezza da accesso di codice dell'integrazione con CLR
Attributi di protezione host e programmazione dell'integrazione con CLR
Creazione di un assembly