programmazione per SQL Server e attributi di protezione host
Per poter caricare ed eseguire codice gestito in un host SQL Server è necessario che siano soddisfatti i requisiti dell'host sia per la sicurezza dall'accesso di codice sia per la sicurezza delle risorse. I requisiti di sicurezza dall'accesso di codice vengono specificati da uno dei tre set di autorizzazioni di SQL Server: SAFE, EXTERNAL-ACCESS o UNSAFE. Per eseguire il codice nell'ambito del set di autorizzazioni SAFE o EXTERNAL-ACCESS, è necessario evitare alcuni tipi o membri a cui è applicato l'attributo HostProtectionAttribute. HostProtectionAttribute rappresenta più una garanzia di affidabilità che non un'autorizzazione di sicurezza, in quanto identifica i costrutti di codice specifici, tipi o metodi, che possono essere disattivati dall'host. L'utilizzo di HostProtectionAttribute impone un modello di programmazione che consente di migliorare la stabilità dell'host.
Attributi di protezione host
Gli attributi di protezione host identificano i tipi o i membri non inclusi nel modello di programmazione host e rappresentano i livelli, riportati di seguito in ordine crescente di gravità, di pericolo per l'affidabilità:
Sono altrimenti benigni.
Possono determinare la destabilizzazione del codice utente gestito dal server.
Possono determinare la destabilizzazione del processo del server.
SQL Server non consente l'utilizzo di un tipo o di un membro con un'istanza di HostProtectionAttribute che specifica per HostProtectionResource il valore SharedState, Synchronization, MayLeakOnAbort o ExternalProcessMgmt. In questo modo si impedisce agli assembly di chiamare membri che attivano la condivisione dello stato, eseguono la sincronizzazione, possono determinare una perdita di risorse al momento della terminazione o influiscono sull'integrità del processo di SQL Server.
Membri e tipi non consentiti
Nella tabella riportata di seguito vengono identificati tipi e membri i cui valori di HostProtectionResource non sono ammessi da SQL Server.
Set di autorizzazioni SQL Server
SQL Server consente agli utenti di specificare i requisiti di affidabilità relativi al codice distribuito in un database. Una volta caricati gli assembly nel database, l'autore dell'assembly può specificare uno dei tre set di autorizzazioni, SAFE, EXTERNAL-ACCESS o UNSAFE, per tale assembly.
Set di autorizzazioni |
SAFE |
EXTERNAL-ACCESS |
UNSAFE |
---|---|---|---|
Sicurezza dall'accesso di codice |
Sola esecuzione |
Esecuzione + accesso alle risorse esterne |
Illimitato |
Restrizioni del modello di programmazione |
Sì |
Sì |
Nessuna restrizione |
Requisito di verificabilità |
Sì |
Sì |
No |
Capacità di chiamata del codice nativo |
No |
No |
Sì |
Con le restrizioni associate per il modello di programmazione consentito, SAFE rappresenta la modalità più affidabile e sicura. Il codice SAFE dispone di funzionalità di sicurezza e affidabilità elevate. Agli assembly SAFE vengono concesse autorizzazioni sufficienti per essere eseguiti, elaborare calcoli e accedere al database locale. Questi assembly devono essere effettivamente indipendenti dai tipi e non possono chiamare codice non gestito.
EXTERNAL-ACCESS, che fornisce un'opzione di sicurezza intermedia, consente al codice di accedere alle risorse esterne al database, offrendo lo stesso livello di affidabilità e protezione di SAFE.
UNSAFE è un set di autorizzazioni per codice estremamente attendibile, che può essere creato solo dagli amministratori di database. Questo codice attendibile non presenta restrizioni di accesso al codice e può chiamare il codice non gestito (nativo).
SQL Server utilizza il livello dei criteri di sicurezza dall'accesso di codice a livello di host per impostare criteri host che concedono uno dei tre set di autorizzazioni in base a quello archiviato nei cataloghi di SQL Server. Il codice gestito in esecuzione all'interno del database ottiene sempre uno di questi set di autorizzazioni di accesso al codice.
Restrizioni relative al modello di programmazione
Per il modello di programmazione relativo al codice gestito in SQL Server sono necessari tipi, funzioni e procedure che non richiedono l'utilizzo dello stato contenuto tra più chiamate né la condivisione dello stato tra più sessioni utente. Inoltre, come descritto in precedenza, la presenza dello stato condiviso può determinare la generazione di eccezioni critiche che influiscono sulla scalabilità e l'affidabilità dell'applicazione.
In base a tali considerazioni, SQL Server non consente l'utilizzo di variabili o membri dati statici. Per gli assembly SAFE ed EXTERNAL-ACCESS, SQL Server esamina i metadati dell'assembly durante la fase CREATE ASSEMBLY e, se rileva la presenza di variabili e membri dati statici, impedisce la creazione di tali assembly.