Attributs de programmation et de protection des hôtes SQL Server

Pouvoir charger et exécuter du code managé sur un hôte SQL Server nécessite de remplir les exigences de l’hôte en matière de sécurité d’accès du code et de protection des ressources de l’hôte. Les exigences pour la sécurité d’accès du code sont spécifiées par l’un des trois jeux d’autorisations SQL Server : SAFE, EXTERNAL-ACCESS ou UNSAFE. Le code exécuté dans les jeux d’autorisations SAFE ou EXTERNAL-ACCESS doit éviter certains types ou membres dont l’attribut HostProtectionAttribute est appliqué. HostProtectionAttribute n’est pas tant une autorisation de sécurité qu’une garantie de fiabilité, car il identifie des constructions de code spécifiques, à savoir des types ou des méthodes, que l’hôte peut interdire. L'utilisation de HostProtectionAttribute applique un modèle de programmation qui contribue à protéger la stabilité de l'hôte.

Notes

La sécurité d’accès du code (CAS) a été déconseillée dans toutes les versions du .NET Framework et de .NET. Les versions récentes de .NET ne respectent pas les annotations CAS et produisent des erreurs si les API liées à CAS sont utilisées. Les développeurs doivent chercher des moyens alternatifs pour accomplir les tâches liées à la sécurité.

Attributs de protection de l'hôte

Les attributs de protection de l’hôte identifient les types ou les membres qui ne sont pas adaptés au modèle de programmation de l’hôte et représentent les niveaux croissants suivants de menace pour la fiabilité :

  • Sans gravité par ailleurs.

  • Susceptible de déstabiliser le code utilisateur géré par le serveur.

  • Susceptible de déstabiliser le processus serveur lui-même.

SQL Server n’autorise pas l’utilisation d’un type ou d’un membre dont l’attribut HostProtectionAttribute spécifie une valeur HostProtectionResource égale à SharedState, Synchronization, MayLeakOnAbort ou ExternalProcessMgmt. Cela empêche les assemblys d’appeler des membres qui activent l’état de partage, effectuent la synchronisation, peuvent entraîner une fuite de ressource à l’arrêt ou affectent l’intégrité du processus SQL Server.

Types et membres rejetés

Le tableau suivant identifie les types et les membres dont les valeurs HostProtectionResource ne sont pas autorisées par SQL Server.

Espace de noms Type ou membre
Microsoft.Win32 Classe PowerModeChangedEventArgs

DéléguéPowerModeChangedEventHandler

Classe SessionEndedEventArgs

DéléguéSessionEndedEventHandler

Classe SessionEndingEventArgs

DéléguéSessionEndingEventHandler

Classe SessionSwitchEventArgs

DéléguéSessionSwitchEventHandler

Classe SystemEvents

Classe TimerElapsedEventArgs

DéléguéTimerElapsedEventHandler

Classe UserPreferenceChangedEventArgs

Classe UserPreferenceChangingEventArgs
System.Collections Méthode ArrayList.Synchronized

Méthode Hashtable.Synchronized

Méthode Queue.Synchronized

Méthode SortedList.Synchronized

Méthode Stack.Synchronized
System.ComponentModel Classe AddingNewEventArgs

DéléguéAddingNewEventHandler

Classe ArrayConverter

Classe AsyncCompletedEventArgs

DéléguéAsyncCompletedEventHandler

Classe AsyncOperation

Classe AsyncOperationManager

Classe AttributeCollection

Classe BackgroundWorker

Classe BaseNumberConverter

Classe BindingList<T>

Classe BooleanConverter

Classe ByteConverter

Classe CancelEventArgs

DéléguéCancelEventHandler

Classe CharConverter

Classe CollectionChangeEventArgs

Délégué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

DéléguéActiveDesignerEventHandler

Classe CheckoutException

Classe CommandID

Classe ComponentChangedEventArgs

DéléguéComponentChangedEventHandler

Classe ComponentChangingEventArgs

DéléguéComponentChangingEventHandler

Classe ComponentEventArgs

DéléguéComponentEventHandler

Classe ComponentRenameEventArgs

DéléguéComponentRenameEventHandler

Classe DesignerCollection

Classe DesignerEventArgs

DéléguéDesignerEventHandler

Classe DesignerOptionService

Classe DesignerTransaction

Classe DesignerTransactionCloseEventArgs

DéléguéDesignerTransactionCloseEventHandler

Classe DesignerVerb

Classe DesignerVerbCollection

Classe DesigntimeLicenseContext

Classe DesigntimeLicenseContextSerializer

Classe MenuCommand

Classe ComponentSerializationService

Classe ContextStack

Classe DesignerLoader

Classe InstanceDescriptor

Classe MemberRelationshipService

Classe ResolveNameEventArgs

DéléguéResolveNameEventHandler

Classe SerializationStore

Classe ServiceContainer

DéléguéServiceCreatorCallback

Classe StandardCommands

Classe StandardToolWindows

Classe DoubleConverter

Classe DoWorkEventArgs

DéléguéDoWorkEventHandler

Classe EnumConverter

Classe EventDescriptor

Classe EventDescriptorCollection

Classe EventHandlerList

Classe ExpandableObjectConverter

Classe HandledEventArgs

DéléguéHandledEventHandler

Classe InstanceCreationEditor

Classe Int16Converter

Classe Int32Converter

Classe Int64Converter

Classe InvalidAsynchronousStateException

Classe InvalidEnumArgumentException

Méthode BeginInvoke

Classe License

Classe LicenseContext

Classe LicenseException

Classe LicenseManager

Classe LicenseProvider

Classe LicFileLicenseProvider

Classe ListChangedEventArgs

DéléguéListChangedEventHandler

Classe ListSortDescription

Classe ListSortDescriptionCollection

Classe MaskedTextProvider

Classe MemberDescriptor

Classe MultilineStringConverter

Classe NestedContainer

Classe NullableConverter

Classe ProgressChangedEventArgs

DéléguéProgressChangedEventHandler

Classe PropertyChangedEventArgs

DéléguéPropertyChangedEventHandler

Classe PropertyDescriptor

Classe PropertyDescriptorCollection

Classe ReferenceConverter

Classe RefreshEventArgs

DéléguéRefreshEventHandler

Classe RunWorkerCompletedEventArgs

Délégué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 Propriété Debug.Listeners

Propriété Trace.Listeners

Propriété EventLog.SynchronizingObject

Classe ConsoleTraceListener

Classe DefaultTraceListener

Classe DelimitedListTraceListener

Classe EventLogTraceListener

Classe PerformanceCounter

Classe PerformanceCounterCategory

Classe Process

Classe ProcessStartInfo

Classe TextWriterTraceListener

Classe TraceListener

Classe XmlWriterTraceListener

Propriété TraceSource.Listeners
System.IO Méthode Stream.Synchronized

Méthode TextReader.Synchronized

Méthode 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 Méthode Group.Synchronized

Méthode Match.Synchronized
System.Threading Classe AutoResetEvent

Classe EventWaitHandle

Classe ManualResetEvent

Classe Monitor

Classe Mutex

Classe ReaderWriterLock

Classe Semaphore

Méthode Thread.AllocateNamedDataSlot

Méthode Thread.BeginCriticalRegion

Méthode Thread.EndCriticalRegion

Méthode Thread.FreeNamedDataSlot

Méthode Thread.GetData

Méthode Thread.Join

Méthode Thread.SetApartmentState

Méthode Thread.SetData

Méthode Thread.SpinWait

Méthode Thread.Start

Méthode Thread.TrySetApartmentState

Classe ThreadPool

Classe Timer
System.Timers Classe Timer
System.Web.Configuration Classe MachineKeyValidationConverter
System.Windows.Forms Propriété AutoCompleteStringCollection.SyncRoot

Jeux d’autorisations SQL Server

SQL Server permet aux utilisateurs de spécifier les exigences de fiabilité du code déployé dans une base de données. Quand des assemblys sont chargés dans la base de données, l’auteur de l’assembly peut spécifier l’un des trois jeux d’autorisations pour cet assembly : SAFE, EXTERNAL-ACCESS ou UNSAFE.

Jeu d’autorisations SAFE EXTERNAL-ACCESS UNSAFE
Sécurité d'accès du code Exécution uniquement Exécution + accès aux ressources externes Non restreint
Restrictions du modèle de programmation Oui Oui Sans restriction
Vérifiabilité requise Oui Oui Non
Possibilité d'appeler du code natif Non Non Oui

SAFE est le mode le plus fiable et sécurisé avec des restrictions associées quant au modèle de programmation autorisé. Le code SAFE présente des fonctionnalités de sécurité et de fiabilité élevées. Les assemblys SAFE bénéficient d'autorisations suffisantes pour s'exécuter, effectuer des calculs et avoir accès à la base de données locale. Les assemblys SAFE doivent être de type sécurisé vérifié et ne sont pas autorisés à appeler du code non managé.

EXTERNAL-ACCESS fournit une option de sécurité intermédiaire. Il permet au code d’accéder à des ressources externes à la base de données, tout en offrant la fiabilité et la sécurité de SAFE.

UNSAFE est réservé à du code hautement approuvé qui peut être créé uniquement par les administrateurs de base de données. Ce code entièrement fiable n’a pas de restrictions d’accès du code et peut appeler du code non managé (natif).

SQL Server utilise la couche de stratégie de sécurité d’accès du code au niveau de l’hôte pour définir une stratégie d’hébergement qui accorde l’un des trois jeux d’autorisations en fonction du jeu d’autorisations stocké dans les catalogues SQL Server. Le code managé qui s'exécute au sein de la base de données obtient toujours l'un de ces jeux d'autorisations d'accès du code.

Restrictions du modèle de programmation

Le modèle de programmation du code managé dans SQL Server nécessite des fonctions, des procédures et des types qui n’ont pas besoin d’utiliser un état maintenu entre les appels ou de partager l’état entre plusieurs sessions utilisateur. Par ailleurs, comme décrit précédemment, la présence d'un état partagé peut provoquer des exceptions critiques qui affectent l'évolutivité et la fiabilité de l'application.

Pour ces raisons, SQL Server n’autorise pas l’utilisation de variables statiques ni de membres de données statiques. Pour les assemblys SAFE et EXTERNAL-ACCESS, SQL Server examine les métadonnées des assemblys au moment de leur création et ne crée pas ces assemblys s’il détecte la présence de membres de données ou variables statiques.

Voir aussi