SQL Server-Programmierung und Hostschutzattribute

Die Möglichkeit zum Laden und Ausführen von verwaltetem Code in einem SQL Server-Host erfordert, dass die Hostanforderungen für die Codezugriffssicherheit und den Hostressourcenschutz erfüllt werden. Die Anforderungen für die Codezugriffssicherheit werden durch einen von drei SQL Server-Berechtigungssätzen angegeben: SICHER, EXTERNER ZUGRIFF oder UNSICHER. Code, der innerhalb der Berechtigungssätze SICHER oder EXTERNER ZUGRIFF ausgeführt wird, muss bestimmte Typen oder Member vermeiden, bei denen das HostProtectionAttribute-Attribut angewendet wird. Die HostProtectionAttribute ist keine Sicherheitsberechtigung, sondern eine Zuverlässigkeitsgarantie, da sie bestimmte Codekonstrukte, entweder Typen oder Methoden, identifiziert, die der Host möglicherweise nicht zulässt. Die Verwendung des HostProtectionAttribute erzwingt ein Programmiermodell, mit dem die Stabilität des Hosts besser geschützt werden kann.

Hinweis

Die Codezugriffssicherheit (CAS, Code Access Security) ist in allen Versionen von .NET Framework und .NET veraltet. Aktuelle Versionen von .NET berücksichtigen keine CAS-Anmerkungen und erzeugen Fehler, wenn CAS-bezogene APIs verwendet werden. Entwickler*innen sollten alternative Mittel zum Ausführen von Sicherheitsaufgaben suchen.

Hostschutzattribute

Hostschutzattribute identifizieren die Typen oder Member, die nicht zum Hostprogrammiermodell passen, und die folgenden erhöhten Zuverlässigkeitsrisiken darstellen:

  • Sie sind andernfalls ohne Auswirkung.

  • Sie können zur Destabilisierung von serververwaltetem Benutzercode führen.

  • Sie können zur Destabilisierung des Serverprozesses führen.

SQL Server lässt die Verwendung eines Typs oder Members nicht zu, wenn dieser über ein HostProtectionAttribute verfügt, der einen HostProtectionResource-Wert von SharedState, Synchronization, MayLeakOnAbort oder ExternalProcessMgmt angibt. Dies verhindert, dass Assemblys Member aufrufen, die die Freigabe des Zustands aktivieren, Synchronisierungen durchführen, möglicherweise ein Ressourcenleck bei Beendigung verursachen, oder Auswirkungen auf die Integrität des SQL Server-Prozesses haben.

Unzulässige Typen und Member

Die folgende Tabelle zeigt die Typen und Member an, deren HostProtectionResource-Werte von SQL Server nicht zugelassen werden.

Namespace Typ oder Member
Microsoft.Win32 PowerModeChangedEventArgs-Klasse

PowerModeChangedEventHandler-Delegat

SessionEndedEventArgs-Klasse

SessionEndedEventHandler-Delegat

SessionEndingEventArgs-Klasse

SessionEndingEventHandler-Delegat

SessionSwitchEventArgs-Klasse

SessionSwitchEventHandler-Delegat

SystemEvents-Klasse

TimerElapsedEventArgs-Klasse

TimerElapsedEventHandler-Delegat

UserPreferenceChangedEventArgs-Klasse

UserPreferenceChangingEventArgs-Klasse
System.Collections ArrayList.Synchronized-Methode

Hashtable.Synchronized-Methode

Queue.Synchronized-Methode

SortedList.Synchronized-Methode

Stack.Synchronized-Methode
System.ComponentModel AddingNewEventArgs-Klasse

AddingNewEventHandler-Delegat

ArrayConverter-Klasse

AsyncCompletedEventArgs-Klasse

AsyncCompletedEventHandler-Delegat

AsyncOperation-Klasse

AsyncOperationManager-Klasse

AttributeCollection-Klasse

BackgroundWorker-Klasse

BaseNumberConverter-Klasse

BindingList<T>-Klasse

BooleanConverter-Klasse

ByteConverter-Klasse

CancelEventArgs-Klasse

CancelEventHandler-Delegat

CharConverter-Klasse

CollectionChangeEventArgs-Klasse

CollectionChangeEventHandler-Delegat

CollectionConverter-Klasse

ComponentCollection-Klasse

ComponentConverter-Klasse

ComponentEditor-Klasse

ComponentResourceManager-Klasse

Container-Klasse

ContainerFilterService-Klasse

CultureInfoConverter-Klasse

CustomTypeDescriptor-Klasse

DateTimeConverter-Klasse

DecimalConverter-Klasse

ActiveDesignerEventArgs-Klasse

ActiveDesignerEventHandler-Delegat

CheckoutException-Klasse

CommandID-Klasse

ComponentChangedEventArgs-Klasse

ComponentChangedEventHandler-Delegat

ComponentChangingEventArgs-Klasse

ComponentChangingEventHandler-Delegat

ComponentEventArgs-Klasse

ComponentEventHandler-Delegat

ComponentRenameEventArgs-Klasse

ComponentRenameEventHandler-Delegat

DesignerCollection-Klasse

DesignerEventArgs-Klasse

DesignerEventHandler-Delegat

DesignerOptionService-Klasse

DesignerTransaction-Klasse

DesignerTransactionCloseEventArgs-Klasse

DesignerTransactionCloseEventHandler-Delegat

DesignerVerb-Klasse

DesignerVerbCollection-Klasse

DesigntimeLicenseContext-Klasse

DesigntimeLicenseContextSerializer-Klasse

MenuCommand-Klasse

ComponentSerializationService-Klasse

ContextStack-Klasse

DesignerLoader-Klasse

InstanceDescriptor-Klasse

MemberRelationshipService-Klasse

ResolveNameEventArgs-Klasse

ResolveNameEventHandler-Delegat

SerializationStore-Klasse

ServiceContainer-Klasse

ServiceCreatorCallback-Delegat

StandardCommands-Klasse

StandardToolWindows-Klasse

DoubleConverter-Klasse

DoWorkEventArgs-Klasse

DoWorkEventHandler-Delegat

EnumConverter-Klasse

EventDescriptor-Klasse

EventDescriptorCollection-Klasse

EventHandlerList-Klasse

ExpandableObjectConverter-Klasse

HandledEventArgs-Klasse

HandledEventHandler-Delegat

InstanceCreationEditor-Klasse

Int16Converter-Klasse

Int32Converter-Klasse

Int64Converter-Klasse

InvalidAsynchronousStateException-Klasse

InvalidEnumArgumentException-Klasse

BeginInvoke-Methode

License-Klasse

LicenseContext-Klasse

LicenseException-Klasse

LicenseManager-Klasse

LicenseProvider-Klasse

LicFileLicenseProvider-Klasse

ListChangedEventArgs-Klasse

ListChangedEventHandler-Delegat

ListSortDescription-Klasse

ListSortDescriptionCollection-Klasse

MaskedTextProvider-Klasse

MemberDescriptor-Klasse

MultilineStringConverter-Klasse

NestedContainer-Klasse

NullableConverter-Klasse

ProgressChangedEventArgs-Klasse

ProgressChangedEventHandler-Delegat

PropertyChangedEventArgs-Klasse

PropertyChangedEventHandler-Delegat

PropertyDescriptor-Klasse

PropertyDescriptorCollection-Klasse

ReferenceConverter-Klasse

RefreshEventArgs-Klasse

RefreshEventHandler-Delegat

RunWorkerCompletedEventArgs-Klasse

RunWorkerCompletedEventHandler-Delegat

SByteConverter-Klasse

SingleConverter-Klasse

StringConverter-Klasse

SyntaxCheck-Klasse

TimeSpanConverter-Klasse

TypeConverter-Klasse

TypeDescriptionProvider-Klasse

TypeDescriptor-Klasse

TypeListConverter-Klasse

UInt16Converter-Klasse

UInt32Converter-Klasse

UInt64Converter-Klasse

WarningException-Klasse

Win32Exception-Klasse
System.Diagnostics Debug.Listeners-Eigenschaft

Trace.Listeners-Eigenschaft

EventLog.SynchronizingObject-Eigenschaft

ConsoleTraceListener-Klasse

DefaultTraceListener-Klasse

DelimitedListTraceListener-Klasse

EventLogTraceListener-Klasse

PerformanceCounter-Klasse

PerformanceCounterCategory-Klasse

Process-Klasse

ProcessStartInfo-Klasse

TextWriterTraceListener-Klasse

TraceListener-Klasse

XmlWriterTraceListener-Klasse

TraceSource.Listeners-Eigenschaft
System.IO Stream.Synchronized-Methode

TextReader.Synchronized-Methode

TextWriter.Synchronized-Methode
System.Reflection.Emit ConstructorBuilder-Klasse

EventBuilder-Klasse

FieldBuilder-Klasse

MethodBuilder-Klasse

CustomAttributeBuilder-Klasse

MethodRental-Klasse

ModuleBuilder-Klasse

PropertyBuilder-Klasse

TypeBuilder-Klasse

UnmanagedMarshal-Klasse
System.Text Group.Synchronized-Methode

Match.Synchronized-Methode
System.Threading AutoResetEvent-Klasse

EventWaitHandle-Klasse

ManualResetEvent-Klasse

Monitor-Klasse

Mutex-Klasse

ReaderWriterLock-Klasse

Semaphore-Klasse

Thread.AllocateNamedDataSlot-Methode

Thread.BeginCriticalRegion-Methode

Thread.EndCriticalRegion-Methode

Thread.FreeNamedDataSlot-Methode

Thread.GetData-Methode

Thread.Join-Methode

Thread.SetApartmentState-Methode

Thread.SetData-Methode

Thread.SpinWait-Methode

Thread.Start-Methode

Thread.TrySetApartmentState-Methode

ThreadPool-Klasse

Timer-Klasse
System.Timers Timer-Klasse
System.Web.Configuration MachineKeyValidationConverter-Klasse
System.Windows.Forms AutoCompleteStringCollection.SyncRoot-Eigenschaft

SQL Server-Berechtigungssätze

SQL Server ermöglicht Benutzern die Angabe der Zuverlässigkeitsanforderungen für in einer Datenbank bereitgestellten Code. Wenn Assemblys in die Datenbank hochgeladen werden, kann der Verfasser der Assembly einen von drei Berechtigungssätzen für diese Assembly angeben: SICHER, EXTERNER ZUGRIFF oder UNSICHER.

Berechtigungssatz SAFE EXTERNER ZUGRIFF UNSAFE
Codezugriffssicherheit Nur ausführen Ausführen + Zugriff auf externe Ressourcen Nicht eingeschränkt
Beschränkungen des Programmiermodells Yes Yes Keine Einschränkungen
Überprüfbarkeit erforderlich Yes Ja Nein
Aufrufbarkeit von systemeigenem Code No Nein Ja

SAFE ist der zuverlässigste und sicherste Modus, der mit Einschränkungen hinsichtlich des zulässigen Programmiermodells einhergeht. SICHERER Code verfügt über Funktionen für hohe Zuverlässigkeit und Sicherheit. Assemblys der Stufe SAFE verfügen über ausreichende Berechtigungen für die Ausführung, die Durchführung von Berechnungen und den Zugriff auf die lokale Datenbank. Assemblys der Stufe SAFE müssen nachweislich typsicher sein und dürfen keinen nicht verwalteten Code aufrufen.

EXTERNER ZUGRIFF bietet eine mittlere Sicherheitsoption, mit der Code auf Ressourcen außerhalb der Datenbank zugreifen kann, aber noch die Zuverlässigkeit und Sicherheit der SICHER-Assembly besteht.

UNSAFE ist für hoch vertrauenswürdigen Code vorgesehen, der nur von Datenbankadministratoren erstellt werden kann. Dieser vertrauenswürdige Code verfügt über keine Zugriffsbeschränkungen und kann nicht verwalteten (nativen) Code aufrufen.

SQL Server verwendet die Sicherheitsrichtlinie für den Codezugriff auf Hostebene, um eine Hostrichtlinie einzurichten, die einen der drei Berechtigungssätze gewährt, die auf dem in SQL Server-Katalogen gespeicherten Berechtigungssatz basiert. Verwaltetem Code, der in der Datenbank ausgeführt wird, wird immer einer dieser Codezugriffsberechtigungssätze abgerufen.

Einschränkungen des Programmiermodells

Das Programmiermodell für verwalteten Code in SQL Server erfordert Funktionen, Prozeduren und Typen, die die Verwendung von Status über mehrere Aufrufe oder die Freigabe des Zustands über mehrere Benutzersitzungen nicht benötigen. Darüber hinaus kann ein Freigabezustand, wie bereits erläutert, zu schwerwiegenden Ausnahmen führen, die die Skalierbarkeit und Zuverlässigkeit der Anwendung gefährden können.

Anhand dieser Gründe lässt SQL Server keine Verwendung von statischen Variablen und statischen Datenmembern zu. Bei SICHER- und EXTERNER ZUGRIFF-Assemblys überprüft SQL Server die Metadaten der Assembly zum Zeitpunkt von ASSEMBLY ERSTELLEN, und lässt die Erstellung dieser Assemblys fehlschlagen, wenn es feststellt, dass statische Datenmember oder Variablen verwendet wurden.

Weitere Informationen