Programování serveru SQL Server a atributy ochrany hostitele

Schopnost načíst a spustit spravovaný kód v hostiteli SQL Serveru vyžaduje splnění požadavků hostitele na zabezpečení přístupu kódu i ochranu prostředků hostitele. Požadavky na zabezpečení přístupu kódu jsou určeny jednou ze tří sad oprávnění SQL Serveru: SAFE, EXTERNAL-ACCESS nebo UNSAFE. Kód spuštěný v rámci sad oprávnění SAFE nebo EXTERNAL-ACCESS se musí vyhnout určitým typům nebo členům s použitým atributem HostProtectionAttribute . Nejedná HostProtectionAttribute se o oprávnění zabezpečení stejně jako záruku spolehlivosti v tom, že identifikuje konkrétní konstrukce kódu, buď typy nebo metody, které může hostitel zakázat. Použití HostProtectionAttribute vynucuje programovací model, který pomáhá chránit stabilitu hostitele.

Poznámka:

Zabezpečení přístupu kódu (CAS) je zastaralé ve všech verzích rozhraní .NET Framework a .NET. Nedávné verze rozhraní .NET nedotknou poznámek CAS a generují chyby, pokud se používají rozhraní API související s casem. Vývojáři by měli hledat alternativní způsoby provádění úloh zabezpečení.

Atributy ochrany hostitele

Atributy ochrany hostitele identifikují typy nebo členy, které neodpovídají programovacímu modelu hostitele, a představují následující zvyšující se úrovně ohrožení spolehlivosti:

  • Jsou jinak neškodné.

  • Mohlo by vést k deaktivaci uživatelského kódu spravovaného serverem.

  • Mohlo by vést k deaktivaci samotného procesu serveru.

SQL Server zakáže použití typu nebo člena, který má HostProtectionAttribute hodnotu HostProtectionResourceSharedState, , Synchronizationnebo MayLeakOnAbortExternalProcessMgmt. Tím zabráníte sestavením volat členy, které umožňují stav sdílení, provádět synchronizaci, způsobit únik prostředků při ukončení nebo ovlivnit integritu procesu SQL Serveru.

Nepovolené typy a členy

Následující tabulka identifikuje typy a členy, jejichž HostProtectionResource hodnoty sql Server nepovolují.

Obor názvů Typ nebo člen
Microsoft.Win32 Třída PowerModeChangedEventArgs

PowerModeChangedEventHandler Delegát

Třída SessionEndedEventArgs

SessionEndedEventHandler Delegát

Třída SessionEndingEventArgs

SessionEndingEventHandler Delegát

Třída SessionSwitchEventArgs

SessionSwitchEventHandler Delegát

Třída SystemEvents

Třída TimerElapsedEventArgs

TimerElapsedEventHandler Delegát

Třída UserPreferenceChangedEventArgs

Třída UserPreferenceChangingEventArgs
System.Collections ArrayList.Synchronized Metoda

Hashtable.Synchronized Metoda

Queue.Synchronized Metoda

SortedList.Synchronized Metoda

Stack.Synchronized Metoda
System.ComponentModel Třída AddingNewEventArgs

AddingNewEventHandler Delegát

Třída ArrayConverter

Třída AsyncCompletedEventArgs

AsyncCompletedEventHandler Delegát

Třída AsyncOperation

Třída AsyncOperationManager

Třída AttributeCollection

Třída BackgroundWorker

Třída BaseNumberConverter

Třída BindingList<T>

Třída BooleanConverter

Třída ByteConverter

Třída CancelEventArgs

CancelEventHandler Delegát

Třída CharConverter

Třída CollectionChangeEventArgs

CollectionChangeEventHandler Delegát

Třída CollectionConverter

Třída ComponentCollection

Třída ComponentConverter

Třída ComponentEditor

Třída ComponentResourceManager

Třída Container

Třída ContainerFilterService

Třída CultureInfoConverter

Třída CustomTypeDescriptor

Třída DateTimeConverter

Třída DecimalConverter

Třída ActiveDesignerEventArgs

ActiveDesignerEventHandler Delegát

Třída CheckoutException

Třída CommandID

Třída ComponentChangedEventArgs

ComponentChangedEventHandler Delegát

Třída ComponentChangingEventArgs

ComponentChangingEventHandler Delegát

Třída ComponentEventArgs

ComponentEventHandler Delegát

Třída ComponentRenameEventArgs

ComponentRenameEventHandler Delegát

Třída DesignerCollection

Třída DesignerEventArgs

DesignerEventHandler Delegát

Třída DesignerOptionService

Třída DesignerTransaction

Třída DesignerTransactionCloseEventArgs

DesignerTransactionCloseEventHandler Delegát

Třída DesignerVerb

Třída DesignerVerbCollection

Třída DesigntimeLicenseContext

Třída DesigntimeLicenseContextSerializer

Třída MenuCommand

Třída ComponentSerializationService

Třída ContextStack

Třída DesignerLoader

Třída InstanceDescriptor

Třída MemberRelationshipService

Třída ResolveNameEventArgs

ResolveNameEventHandler Delegát

Třída SerializationStore

Třída ServiceContainer

ServiceCreatorCallback Delegát

Třída StandardCommands

Třída StandardToolWindows

Třída DoubleConverter

Třída DoWorkEventArgs

DoWorkEventHandler Delegát

Třída EnumConverter

Třída EventDescriptor

Třída EventDescriptorCollection

Třída EventHandlerList

Třída ExpandableObjectConverter

Třída HandledEventArgs

HandledEventHandler Delegát

Třída InstanceCreationEditor

Třída Int16Converter

Třída Int32Converter

Třída Int64Converter

Třída InvalidAsynchronousStateException

Třída InvalidEnumArgumentException

BeginInvoke Metoda

Třída License

Třída LicenseContext

Třída LicenseException

Třída LicenseManager

Třída LicenseProvider

Třída LicFileLicenseProvider

Třída ListChangedEventArgs

ListChangedEventHandler Delegát

Třída ListSortDescription

Třída ListSortDescriptionCollection

Třída MaskedTextProvider

Třída MemberDescriptor

Třída MultilineStringConverter

Třída NestedContainer

Třída NullableConverter

Třída ProgressChangedEventArgs

ProgressChangedEventHandler Delegát

Třída PropertyChangedEventArgs

PropertyChangedEventHandler Delegát

Třída PropertyDescriptor

Třída PropertyDescriptorCollection

Třída ReferenceConverter

Třída RefreshEventArgs

RefreshEventHandler Delegát

Třída RunWorkerCompletedEventArgs

RunWorkerCompletedEventHandler Delegát

Třída SByteConverter

Třída SingleConverter

Třída StringConverter

Třída SyntaxCheck

Třída TimeSpanConverter

Třída TypeConverter

Třída TypeDescriptionProvider

Třída TypeDescriptor

Třída TypeListConverter

Třída UInt16Converter

Třída UInt32Converter

Třída UInt64Converter

Třída WarningException

Třída Win32Exception
System.Diagnostics Debug.Listeners Vlastnost

Trace.Listeners Vlastnost

EventLog.SynchronizingObject Vlastnost

Třída ConsoleTraceListener

Třída DefaultTraceListener

Třída DelimitedListTraceListener

Třída EventLogTraceListener

Třída PerformanceCounter

Třída PerformanceCounterCategory

Třída Process

Třída ProcessStartInfo

Třída TextWriterTraceListener

Třída TraceListener

Třída XmlWriterTraceListener

TraceSource.Listeners Vlastnost
System.IO Stream.Synchronized Metoda

TextReader.Synchronized Metoda

TextWriter.Synchronized Metoda
System.Reflection.Emit Třída ConstructorBuilder

Třída EventBuilder

Třída FieldBuilder

Třída MethodBuilder

Třída CustomAttributeBuilder

Třída MethodRental

Třída ModuleBuilder

Třída PropertyBuilder

Třída TypeBuilder

Třída UnmanagedMarshal
System.Text Group.Synchronized Metoda

Match.Synchronized Metoda
System.Threading Třída AutoResetEvent

Třída EventWaitHandle

Třída ManualResetEvent

Třída Monitor

Třída Mutex

Třída ReaderWriterLock

Třída Semaphore

Thread.AllocateNamedDataSlot Metoda

Thread.BeginCriticalRegion Metoda

Thread.EndCriticalRegion Metoda

Thread.FreeNamedDataSlot Metoda

Thread.GetData Metoda

Thread.Join Metoda

Thread.SetApartmentState Metoda

Thread.SetData Metoda

Thread.SpinWait Metoda

Thread.Start Metoda

Thread.TrySetApartmentState Metoda

Třída ThreadPool

Třída Timer
System.Timers Třída Timer
System.Web.Configuration Třída MachineKeyValidationConverter
System.Windows.Forms AutoCompleteStringCollection.SyncRoot Vlastnost

Sady oprávnění SQL Serveru

SQL Server umožňuje uživatelům určit požadavky na spolehlivost kódu nasazeného do databáze. Při nahrání sestavení do databáze může autor sestavení určit jednu ze tří sad oprávnění pro toto sestavení: BEZPEČNÉ, EXTERNÍ PŘÍSTUP nebo NEBEZPEČNÉ.

Sada oprávnění BEZPEČNÉ EXTERNÍ PŘÍSTUP NEBEZPEČNÉ
Zabezpečení přístupu kódu Spustit pouze Spuštění a přístup k externím prostředkům Neomezené
Omezení programovacího modelu Ano Yes Žádná omezení
Požadavek na ověřitelnost Ano Ano No
Schopnost volat nativní kód No No Ano

SAFE je nejspolehlivější a nejbezpečnější režim s přidruženými omezeními z hlediska povoleného programovacího modelu. Kód SAFE má vysoce spolehlivé a bezpečnostní funkce. Sestavení SAFE mají dostatečná oprávnění ke spuštění, provádění výpočtů a přístupu k místní databázi. Sestavení SAFE musí být ověřitelně typově bezpečná a nesmí volat nespravovaný kód.

EXTERNAL-ACCESS poskytuje zprostředkující možnost zabezpečení, která umožňuje kódu přistupovat k prostředkům externím databázím, ale stále má spolehlivost a bezpečnost SAFE.

NEBEZPEČNÉ je pro vysoce důvěryhodný kód, který může vytvářet pouze správci databáze. Tento důvěryhodný kód nemá žádná omezení přístupu ke kódu a může volat nespravovaný (nativní) kód.

SQL Server používá vrstvu zásad zabezpečení přístupu kódu na úrovni hostitele k nastavení zásady hostitele, která uděluje jednu ze tří sad oprávnění na základě sady oprávnění uložené v katalogech SQL Serveru. Spravovaný kód spuštěný v databázi vždy získá jednu z těchto sad oprávnění pro přístup ke kódu.

Omezení programovacího modelu

Programovací model spravovaného kódu v SQL Serveru vyžaduje funkce, postupy a typy, které nevyžadují použití stavu uchovávaného v několika vyvolání nebo sdílení stavu napříč několika uživatelskými relacemi. Jak je popsáno výše, přítomnost sdíleného stavu může způsobit kritické výjimky, které mají vliv na škálovatelnost a spolehlivost aplikace.

Vzhledem k těmto aspektům SQL Server zakáže použití statických proměnných a statických datových členů. V případě sestavení SAFE a EXTERNAL-ACCESS sql Server prozkoumá metadata sestavení v době VYTVOŘENÍ SESTAVENÍ a selže vytvoření těchto sestavení, pokud najde použití statických datových členů a proměnných.

Viz také