Condividi tramite


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_ACCESSo 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