Sdílet prostřednictvím


Atributy programování a zabezpečení hostitele pro SQL Server

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 sady oprávnění SAFE nebo EXTERNAL-ACCESS se musí vyhnout určitým typům nebo členům s použitým atributem HostProtectionAttribute . HostProtectionAttribute není oprávněním zabezpečení, jako spíše zárukou spolehlivosti, jelikož identifikuje konkrétní konstrukce kódu, buď typy nebo metody, které může host 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 .NET nezohledňují anotace CAS a způsobují chyby, pokud se používají API související s CAS. 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 zakazuje použití typu nebo člena, který má HostProtectionAttribute se specifikovanou hodnotou HostProtectionResource, SharedState, Synchronization nebo 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í.

Namespace Typ nebo člen
Microsoft.Win32 Třída PowerModeChangedEventArgs

PowerModeChangedEventHandler delegovat

Třída SessionEndedEventArgs

SessionEndedEventHandler delegovat

Třída SessionEndingEventArgs

SessionEndingEventHandler delegovat

Třída SessionSwitchEventArgs

SessionSwitchEventHandler delegovat

Třída SystemEvents

Třída TimerElapsedEventArgs

TimerElapsedEventHandler delegovat

Třída UserPreferenceChangedEventArgs

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

metoda Hashtable.Synchronized

metoda Queue.Synchronized

metoda SortedList.Synchronized

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

AddingNewEventHandler delegovat

Třída ArrayConverter

Třída AsyncCompletedEventArgs

AsyncCompletedEventHandler delegovat

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 delegovat

Třída CharConverter

Třída CollectionChangeEventArgs

CollectionChangeEventHandler delegovat

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 delegovat

Třída CheckoutException

Třída CommandID

Třída ComponentChangedEventArgs

ComponentChangedEventHandler delegovat

Třída ComponentChangingEventArgs

ComponentChangingEventHandler delegovat

Třída ComponentEventArgs

ComponentEventHandler delegovat

Třída ComponentRenameEventArgs

ComponentRenameEventHandler delegovat

Třída DesignerCollection

Třída DesignerEventArgs

DesignerEventHandler delegovat

Třída DesignerOptionService

Třída DesignerTransaction

Třída DesignerTransactionCloseEventArgs

DesignerTransactionCloseEventHandler delegovat

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 delegovat

Třída SerializationStore

Třída ServiceContainer

ServiceCreatorCallback delegovat

Třída StandardCommands

Třída StandardToolWindows

Třída DoubleConverter

Třída DoWorkEventArgs

DoWorkEventHandler delegovat

Třída EnumConverter

Třída EventDescriptor

Třída EventDescriptorCollection

Třída EventHandlerList

Třída ExpandableObjectConverter

Třída HandledEventArgs

HandledEventHandler delegovat

Třída InstanceCreationEditor

Třída Int16Converter

Třída Int32Converter

Třída Int64Converter

Třída InvalidAsynchronousStateException

Třída InvalidEnumArgumentException

metoda BeginInvoke

Třída License

Třída LicenseContext

Třída LicenseException

Třída LicenseManager

Třída LicenseProvider

Třída LicFileLicenseProvider

Třída ListChangedEventArgs

ListChangedEventHandler delegovat

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 delegovat

Třída PropertyChangedEventArgs

PropertyChangedEventHandler delegovat

Třída PropertyDescriptor

Třída PropertyDescriptorCollection

Třída ReferenceConverter

Třída RefreshEventArgs

RefreshEventHandler delegovat

Třída RunWorkerCompletedEventArgs

RunWorkerCompletedEventHandler delegovat

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 metoda Stream.Synchronized

metoda TextReader.Synchronized

metoda TextWriter.Synchronized
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 metoda Group.Synchronized

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

Třída EventWaitHandle

Třída ManualResetEvent

Třída Monitor

Třída Mutex

Třída ReaderWriterLock

Třída Semaphore

metoda 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

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í TREZOR EXTERNAL-ACCESS NEBEZPEČNÝ
Zabezpečení přístupu ke kódu Spustit pouze Spuštění a přístup k externím prostředkům Neomezený
Omezení programovacího modelu Ano Ano Žádná omezení
Požadavek na ověřitelnost Ano Ano Ne
Schopnost volat nativní kód Ne Ne 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 přesto mít 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á omezení přístupu 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ů. U sestavení SAFE a EXTERNAL-ACCESS SQL Server prozkoumá metadata sestavení v době VYTVOŘENÍ SESTAVENÍ a selže při vytváření těchto sestavení, pokud najde použití statických datových členů a proměnných.

Viz také