Freigeben über


SQL Server-Programmierungs- und Hostschutzattribute

Die Möglichkeit zum Laden und Ausführen von verwaltetem Code in einem SQL Server-Host erfordert die Erfüllung der Anforderungen des Hosts für codezugriffssicherheit und Hostressourcenschutz. Die Sicherheitsanforderungen für den Codezugriff werden durch einen von drei SQL Server-Berechtigungssätzen angegeben: SAFE, EXTERNAL-ACCESS oder UNSAFE. Code, der innerhalb der SAFE- oder EXTERNAL-ACCESS-Berechtigungssätze ausgeführt wird, muss bestimmte Typen oder Member, auf die das HostProtectionAttribute Attribut angewendet wurde, vermeiden. Das HostProtectionAttribute ist weniger eine Sicherheitsberechtigung als vielmehr eine Zuverlässigkeitsgarantie, indem es spezifische Codekonstrukte, entweder Typen oder Methoden, identifiziert, die der Host möglicherweise nicht zulassen darf. Die Verwendung der HostProtectionAttribute erzwingt ein Programmiermodell, das die Stabilität des Hosts schützt.

Hinweis

Code Access Security (CAS) 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 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 verbietet die Verwendung eines Typs oder Elements, das einen HostProtectionAttribute-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 Elemente

In der folgenden Tabelle werden Typen und Member identifiziert, deren HostProtectionResource Werte von SQL Server nicht zulässig sind.

Namespace Typ oder Mitglied
Microsoft.Win32 PowerModeChangedEventArgs-Klasse

PowerModeChangedEventHandler delegieren

SessionEndedEventArgs-Klasse

SessionEndedEventHandler delegieren

SessionEndingEventArgs-Klasse

SessionEndingEventHandler delegieren

SessionSwitchEventArgs-Klasse

SessionSwitchEventHandler delegieren

SystemEvents-Klasse

TimerElapsedEventArgs-Klasse

TimerElapsedEventHandler delegieren

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 delegieren

ArrayConverter-Klasse

AsyncCompletedEventArgs-Klasse

AsyncCompletedEventHandler delegieren

AsyncOperation-Klasse

AsyncOperationManager-Klasse

AttributeCollection-Klasse

BackgroundWorker-Klasse

BaseNumberConverter-Klasse

BindingList<T>-Klasse

BooleanConverter-Klasse

ByteConverter-Klasse

CancelEventArgs-Klasse

CancelEventHandler delegieren

CharConverter-Klasse

CollectionChangeEventArgs-Klasse

CollectionChangeEventHandler delegieren

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 delegieren

CheckoutException-Klasse

CommandID-Klasse

ComponentChangedEventArgs-Klasse

ComponentChangedEventHandler delegieren

ComponentChangingEventArgs-Klasse

ComponentChangingEventHandler delegieren

ComponentEventArgs-Klasse

ComponentEventHandler delegieren

ComponentRenameEventArgs-Klasse

ComponentRenameEventHandler delegieren

DesignerCollection-Klasse

DesignerEventArgs-Klasse

DesignerEventHandler delegieren

DesignerOptionService-Klasse

DesignerTransaction-Klasse

DesignerTransactionCloseEventArgs-Klasse

DesignerTransactionCloseEventHandler delegieren

DesignerVerb-Klasse

DesignerVerbCollection-Klasse

DesigntimeLicenseContext-Klasse

DesigntimeLicenseContextSerializer-Klasse

MenuCommand-Klasse

ComponentSerializationService-Klasse

ContextStack-Klasse

DesignerLoader-Klasse

InstanceDescriptor-Klasse

MemberRelationshipService-Klasse

ResolveNameEventArgs-Klasse

ResolveNameEventHandler delegieren

SerializationStore-Klasse

ServiceContainer-Klasse

ServiceCreatorCallback delegieren

StandardCommands-Klasse

StandardToolWindows-Klasse

DoubleConverter-Klasse

DoWorkEventArgs-Klasse

DoWorkEventHandler delegieren

EnumConverter-Klasse

EventDescriptor-Klasse

EventDescriptorCollection-Klasse

EventHandlerList-Klasse

ExpandableObjectConverter-Klasse

HandledEventArgs-Klasse

HandledEventHandler delegieren

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 delegieren

ListSortDescription-Klasse

ListSortDescriptionCollection-Klasse

MaskedTextProvider-Klasse

MemberDescriptor-Klasse

MultilineStringConverter-Klasse

NestedContainer-Klasse

NullableConverter-Klasse

ProgressChangedEventArgs-Klasse

ProgressChangedEventHandler delegieren

PropertyChangedEventArgs-Klasse

PropertyChangedEventHandler delegieren

PropertyDescriptor-Klasse

PropertyDescriptorCollection-Klasse

ReferenceConverter-Klasse

RefreshEventArgs-Klasse

RefreshEventHandler delegieren

RunWorkerCompletedEventArgs-Klasse

RunWorkerCompletedEventHandler delegieren

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 Code, der in einer Datenbank bereitgestellt wird. Wenn Assemblys in die Datenbank hochgeladen werden, kann der Autor der Assembly einen von drei Berechtigungssätzen für diese Assembly angeben: SAFE, EXTERNAL-ACCESS oder UNSAFE.

Berechtigungssatz SICHER EXTERNER ZUGRIFF UNSICHER
Codezugriffssicherheit Nur ausführen Ausführen + Zugriff auf externe Ressourcen Uneingeschränkt
Beschränkungen des Programmiermodells Ja Ja Keine Einschränkungen
Überprüfbarkeit erforderlich Ja Ja Nein
Aufrufbarkeit von systemeigenem Code Nein Nein Ja

SAFE ist der zuverlässigste und sicherste Modus, der mit Einschränkungen hinsichtlich des zulässigen Programmiermodells einhergeht. SAFE-Code verfügt über hohe Zuverlässigkeits- und Sicherheitsfeatures. 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.

EXTERNAL-ACCESS bietet eine Zwischensicherheitsoption, sodass Code auf Ressourcen außerhalb der Datenbank zugreifen kann, aber dennoch die Zuverlässigkeit und Sicherheit von SAFE hat.

UNSAFE ist für hoch vertrauenswürdigen Code vorgesehen, der nur von Datenbankadministratoren erstellt werden kann. Dieser vertrauenswürdige Code hat keine Codezugriffseinschränkungen und kann nicht verwalteten (systemeigenen) Code aufrufen.

SQL Server verwendet die Sicherheitsrichtlinienebene für den Codezugriff auf Hostebene, um eine Hostrichtlinie einzurichten, die einen der drei Berechtigungssätze basierend auf dem in SQL Server-Katalogen gespeicherten Berechtigungssatz gewährt. 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.

In Anbetracht dieser Überlegungen verbietet SQL Server die Verwendung statischer Variablen und statischer Datenmmber. Bei SAFE- und EXTERNAL-ACCESS-Assemblys untersucht SQL Server die Metadaten der Assembly zum Zeitpunkt von CREATE ASSEMBLY und schlägt die Erstellung solcher Assemblys fehl, wenn die Verwendung statischer Datenmitglieder und -variablen festgestellt wird.

Siehe auch