Condividi tramite


Restrizioni del modello di programmazione per l'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, SQL Server esegue determinati controlli di codice che devono essere considerati. Questi controlli vengono eseguiti sull'assembly del codice gestito quando vengono registrati per la prima volta nel database, usando l'istruzione CREATE ASSEMBLY e anche in fase di esecuzione. Il codice gestito viene controllato anche in fase di esecuzione perché in un assembly potrebbero esserci percorsi di codice che potrebbero non essere mai effettivamente raggiunti in fase di esecuzione.

Questi controlli di codice offrono flessibilità per la registrazione di assembly di terze parti in particolare, in modo che un assembly non venga bloccato in cui è presente codice non sicuro progettato per l'esecuzione in un ambiente client, ma non verrà mai eseguito in Common Language Runtime (CLR) ospitato. I requisiti che il codice gestito deve soddisfare dipendono dal fatto che l'assembly sia registrato come SAFE, EXTERNAL_ACCESSo UNSAFE. SAFE è il livello di sicurezza più rigoroso.

Oltre alle restrizioni inserite negli assembly del codice gestito, vengono concesse anche delle autorizzazioni di sicurezza da accesso di codice. CLR supporta un modello di sicurezza per il codice gestito denominato CAS (Code Access Security). 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 ClR Integration Code Access Security.

Se i criteri dell'editore sono impostati, CREATE ASSEMBLY ha esito negativo.

Controlli CREATE ASSEMBLY

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

  • Si sta usando 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 usati per archiviare le informazioni. Sono consentiti campi statici di sola lettura.

  • Viene superato il test PEVerify. Lo strumento PEVerify (peverify.exe), che verifica che il codice CIL (Common Intermediate Language) e i metadati associati soddisfino i requisiti di sicurezza dei tipi, viene fornito con .NET Framework SDK.

  • La sincronizzazione, ad esempio con la SynchronizationAttribute classe , non viene usata.

  • I metodi finalizzatori non vengono usati.

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 di runtime

In fase di esecuzione l'assembly del codice viene esaminato per verificare la presenza delle condizioni riportate di seguito. Se viene trovata una di queste condizioni, il codice gestito non è autorizzato a essere eseguito e viene generata un'eccezione.

UNSAFE

Non è possibile caricare un assembly in modo esplicito chiamando il System.Reflection.Assembly.Load() metodo da una matrice di byte o usando Reflection.Emit in modo implicito lo spazio dei nomi.

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 altre informazioni su 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.