Restrizioni relative al modello di programmazione dell'integrazione con CLR

Si applica a: SQL Server Istanza gestita di SQL di Azure

Quando si compila una stored procedure gestita o un altro oggetto di database gestito, esistono determinati controlli del codice eseguiti da SQL Server che devono essere considerati. 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 dispongono di autorizzazioni CAS diverse. Per altre informazioni, vedere Sicurezza dall'accesso al codice di integrazione CLR.

Controlli CREATE ASSEMBLY

Quando viene eseguita l'istruzione CREATE ASSEMBLY , vengono eseguiti i controlli seguenti per ogni livello di sicurezza. Se un controllo ha esito negativo, CREATE ASSEMBLY avrà esito negativo con 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<location> e tutti gli assembly a cui si fa riferimento e le relative dipendenze sono disponibili nel <percorso>.

  • Si usa 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 usata.

  • 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

  • Vengono controllate tutte le condizioni di assembly EXTERNAL_ACCESS .

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 metodo System.Reflection.Assembly.Load() da una matrice di byte o in modo implicito tramite l'uso dello spazio dei nomi Reflection.Emit non è consentito.

EXTERNAL_ACCESS

Vengono controllate tutte le condizioni UNSAFE .

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

Vengono controllate tutte le condizioni EXTERNAL_ACCESS .

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