Condividi tramite


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.

Spazio dei nomi

Tipo o membro

Microsoft.Win32

Classe PowerModeChangedEventArgs

Delegato PowerModeChangedEventHandler

Classe SessionEndedEventArgs

Delegato SessionEndedEventHandler

Classe SessionEndingEventArgs

Delegato SessionEndingEventHandler

Classe SessionSwitchEventArgs

Delegato SessionSwitchEventHandler

Classe SystemEvents

Classe TimerElapsedEventArgs

Delegato TimerElapsedEventHandler

Classe UserPreferenceChangedEventArgs

Classe UserPreferenceChangingEventArgs

System.Collections

Metodo ArrayList.Synchronized

Metodo Hashtable.Synchronized

Metodo Queue.Synchronized

Metodo SortedList.Synchronized

Metodo Stack.Synchronized

System.ComponentModel

Classe AddingNewEventArgs

Delegato AddingNewEventHandler

Classe ArrayConverter

Classe AsyncCompletedEventArgs

Delegato AsyncCompletedEventHandler

Classe AsyncOperation

Classe AsyncOperationManager

Classe AttributeCollection

Classe BackgroundWorker

Classe BaseNumberConverter

Classe BindingList<T>

Classe BooleanConverter

Classe ByteConverter

Classe CancelEventArgs

Delegato CancelEventHandler

Classe CharConverter

Classe CollectionChangeEventArgs

Delegato CollectionChangeEventHandler

Classe CollectionConverter

Classe ComponentCollection

Classe ComponentConverter

Classe ComponentEditor

Classe ComponentResourceManager

Classe Container

Classe ContainerFilterService

Classe CultureInfoConverter

Classe CustomTypeDescriptor

Classe DateTimeConverter

Classe DecimalConverter

Classe ActiveDesignerEventArgs

Delegato ActiveDesignerEventHandler

Classe CheckoutException

Classe CommandID

Classe ComponentChangedEventArgs

Delegato ComponentChangedEventHandler

Classe ComponentChangingEventArgs

Delegato ComponentChangingEventHandler

Classe ComponentEventArgs

Delegato ComponentEventHandler

Classe ComponentRenameEventArgs

Delegato ComponentRenameEventHandler

Classe DesignerCollection

Classe DesignerEventArgs

Delegato DesignerEventHandler

Classe DesignerOptionService

Classe DesignerTransaction

Classe DesignerTransactionCloseEventArgs

Delegato DesignerTransactionCloseEventHandler

Classe DesignerVerb

Classe DesignerVerbCollection

Classe DesigntimeLicenseContext

Classe DesigntimeLicenseContextSerializer

Classe MenuCommand

Classe ComponentSerializationService

Classe ContextStack

Classe DesignerLoader

Classe InstanceDescriptor

Classe MemberRelationshipService

Classe ResolveNameEventArgs

Delegato ResolveNameEventHandler

Classe SerializationStore

Classe ServiceContainer

Delegato ServiceCreatorCallback

Classe StandardCommands

Classe StandardToolWindows

Classe DoubleConverter

Classe DoWorkEventArgs

Delegato DoWorkEventHandler

Classe EnumConverter

Classe EventDescriptor

Classe EventDescriptorCollection

Classe EventHandlerList

Classe ExpandableObjectConverter

Classe HandledEventArgs

Delegato HandledEventHandler

Classe InstanceCreationEditor

Classe Int16Converter

Classe Int32Converter

Classe Int64Converter

Classe InvalidAsynchronousStateException

Classe InvalidEnumArgumentException

Metodo BeginInvoke

Classe License

Classe LicenseContext

Classe LicenseException

Classe LicenseManager

Classe LicenseProvider

Classe LicFileLicenseProvider

Classe ListChangedEventArgs

Delegato ListChangedEventHandler

Classe ListSortDescription

Classe ListSortDescriptionCollection

Classe MaskedTextProvider

Classe MemberDescriptor

Classe MultilineStringConverter

Classe NestedContainer

Classe NullableConverter

Classe ProgressChangedEventArgs

Delegato ProgressChangedEventHandler

Classe PropertyChangedEventArgs

Delegato PropertyChangedEventHandler

Classe PropertyDescriptor

Classe PropertyDescriptorCollection

Classe ReferenceConverter

Classe RefreshEventArgs

Delegato RefreshEventHandler

Classe RunWorkerCompletedEventArgs

Delegato RunWorkerCompletedEventHandler

Classe SByteConverter

Classe SingleConverter

Classe StringConverter

Classe SyntaxCheck

Classe TimeSpanConverter

Classe TypeConverter

Classe TypeDescriptionProvider

Classe TypeDescriptor

Classe TypeListConverter

Classe UInt16Converter

Classe UInt32Converter

Classe UInt64Converter

Classe WarningException

Classe Win32Exception

System.Diagnostics

Proprietà Debug.Listeners

Proprietà Trace.Listeners

Proprietà EventLog.SynchronizingObject

Classe ConsoleTraceListener

Classe DefaultTraceListener

Classe DelimitedListTraceListener

Classe EventLogTraceListener

Classe PerformanceCounter

Classe PerformanceCounterCategory

Classe Process

Classe ProcessStartInfo

Classe TextWriterTraceListener

Classe TraceListener

Classe XmlWriterTraceListener

Proprietà TraceSource.Listeners

System.IO

Metodo Stream.Synchronized

Metodo TextReader.Synchronized

Metodo TextWriter.Synchronized

System.Reflection.Emit

Classe ConstructorBuilder

Classe EventBuilder

Classe FieldBuilder

Classe MethodBuilder

Classe CustomAttributeBuilder

Classe MethodRental

Classe ModuleBuilder

Classe PropertyBuilder

Classe TypeBuilder

Classe UnmanagedMarshal

System.Text

Metodo Group.Synchronized

Metodo Match.Synchronized

System.Threading

Classe AutoResetEvent

Classe EventWaitHandle

Classe ManualResetEvent

Classe Monitor

Classe Mutex

Classe ReaderWriterLock

Classe Semaphore

Metodo Thread.AllocateNamedDataSlot

Metodo Thread.BeginCriticalRegion

Metodo Thread.EndCriticalRegion

Metodo Thread.FreeNamedDataSlot

Metodo Thread.GetData

Metodo Thread.Join

Metodo Thread.SetApartmentState

Metodo Thread.SetData

Metodo Thread.SpinWait

Metodo Thread.Start

Metodo Thread.TrySetApartmentState

Classe ThreadPool

Classe Timer

System.Timers

Classe Timer

System.Web.Configuration

Classe MachineKeyValidationConverter

System.Windows.Forms

Proprietà AutoCompleteStringCollection.SyncRoot

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

Nessuna restrizione

Requisito di verificabilità

No

Capacità di chiamata del codice nativo

No

No

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.

Vedere anche

Riferimenti

HostProtectionAttribute

HostProtectionResource