программирование SQL Server и атрибуты защиты основного приложения

Возможность загрузки и выполнения управляемого кода в основном приложении SQL Server нуждается в выполнении требований, предъявляемых основным приложением, как к управлению доступом для кода, так и к защите ресурсов основного приложения. Требования к управлению доступом для кода указаны в одном из трех наборов разрешений SQL: SAFE, EXTERNAL-ACCESS или UNSAFE. Код, выполняемый в наборе разрешений SAFE или EXTERNAL-ACCESS, должен избегать использования определенных типов или элементов, в которых применяется атрибут HostProtectionAttribute. Атрибут HostProtectionAttribute не является разрешением безопасности, насколько это может быть гарантировано надежностью, так как он определяет некоторые конструкции кода (типы или методы), которые могут быть неразрешены в основном приложении. Использование атрибута HostProtectionAttribute принудительно включает модель программирования, которая способствует обеспечению стабильности основного приложения.

Атрибуты защиты основного приложения

Атрибуты защиты основного приложения идентифицируют типы или элементы, которые не вписываются в модель программирования основного приложения и представляют следующие угрозы безопасности, увеличенные по сравнению со стандартной моделью:

  • В других условиях являются малоэффективными.

  • Могут привести к дестабилизации пользовательского кода, управляемого сервером.

  • Могут привести к дестабилизации самого процесса сервера.

В SQL Server не разрешено использовать тип или элемент, который имеет атрибут HostProtectionAttribute, указывающий значение HostProtectionResource объектов SharedState, Synchronization, MayLeakOnAbort или ExternalProcessMgmt. Это не дает сборкам вызывать элементы, которые разрешают общее состояние, выполняют синхронизацию, могут привести к утечке ресурсов при завершении или влияют на целостность процесса SQL Server.

Запрещенные типы и элементы

В следующей таблице приведены типы и элементы, значения HostProtectionResource которых запрещены в SQL Server.

Пространство имен

Тип или элемент

Microsoft.Win32

Класс PowerModeChangedEventArgs

Делегат PowerModeChangedEventHandler

Класс SessionEndedEventArgs

Делегат SessionEndedEventHandler

Класс SessionEndingEventArgs

Делегат SessionEndingEventHandler

Класс SessionSwitchEventArgs

Делегат SessionSwitchEventHandler

Класс SystemEvents

Класс TimerElapsedEventArgs

Делегат TimerElapsedEventHandler

Класс UserPreferenceChangedEventArgs

Класс UserPreferenceChangingEventArgs

System.Collections

Метод ArrayList.Synchronized

Метод Hashtable.Synchronized

Метод Queue.Synchronized

Метод SortedList.Synchronized

Метод Stack.Synchronized

System.ComponentModel

Класс AddingNewEventArgs

Делегат AddingNewEventHandler

Класс ArrayConverter

Класс AsyncCompletedEventArgs

Делегат AsyncCompletedEventHandler

Класс AsyncOperation

Класс AsyncOperationManager

Класс AttributeCollection

Класс BackgroundWorker

Класс BaseNumberConverter

Класс BindingList<T>

Класс BooleanConverter

Класс ByteConverter

Класс CancelEventArgs

Делегат CancelEventHandler

Класс CharConverter

Класс CollectionChangeEventArgs

Делегат CollectionChangeEventHandler

Класс CollectionConverter

Класс ComponentCollection

Класс ComponentConverter

Класс ComponentEditor

Класс ComponentResourceManager

Класс Container

Класс ContainerFilterService

Класс CultureInfoConverter

Класс CustomTypeDescriptor

Класс DateTimeConverter

Класс DecimalConverter

Класс ActiveDesignerEventArgs

Делегат ActiveDesignerEventHandler

Класс CheckoutException

Класс CommandID

Класс ComponentChangedEventArgs

Делегат ComponentChangedEventHandler

Класс ComponentChangingEventArgs

Делегат ComponentChangingEventHandler

Класс ComponentEventArgs

Делегат ComponentEventHandler

Класс ComponentRenameEventArgs

Делегат ComponentRenameEventHandler

Класс DesignerCollection

Класс DesignerEventArgs

Делегат DesignerEventHandler

Класс DesignerOptionService

Класс DesignerTransaction

Класс DesignerTransactionCloseEventArgs

Делегат DesignerTransactionCloseEventHandler

Класс DesignerVerb

Класс DesignerVerbCollection

Класс DesigntimeLicenseContext

Класс DesigntimeLicenseContextSerializer

Класс MenuCommand

Класс ComponentSerializationService

Класс ContextStack

Класс DesignerLoader

Класс InstanceDescriptor

Класс MemberRelationshipService

Класс ResolveNameEventArgs

Делегат ResolveNameEventHandler

Класс SerializationStore

Класс ServiceContainer

Делегат ServiceCreatorCallback

Класс StandardCommands

Класс StandardToolWindows

Класс DoubleConverter

Класс DoWorkEventArgs

Делегат DoWorkEventHandler

Класс EnumConverter

Класс EventDescriptor

Класс EventDescriptorCollection

Класс EventHandlerList

Класс ExpandableObjectConverter

Класс HandledEventArgs

Делегат HandledEventHandler

Класс InstanceCreationEditor

Класс Int16Converter

Класс Int32Converter

Класс Int64Converter

Класс InvalidAsynchronousStateException

Класс InvalidEnumArgumentException

Метод BeginInvoke

Класс License

Класс LicenseContext

Класс LicenseException

Класс LicenseManager

Класс LicenseProvider

Класс LicFileLicenseProvider

Класс ListChangedEventArgs

Делегат ListChangedEventHandler

Класс ListSortDescription

Класс ListSortDescriptionCollection

Класс MaskedTextProvider

Класс MemberDescriptor

Класс MultilineStringConverter

Класс NestedContainer

Класс NullableConverter

Класс ProgressChangedEventArgs

Делегат ProgressChangedEventHandler

Класс PropertyChangedEventArgs

Делегат PropertyChangedEventHandler

Класс PropertyDescriptor

Класс PropertyDescriptorCollection

Класс ReferenceConverter

Класс RefreshEventArgs

Делегат RefreshEventHandler

Класс RunWorkerCompletedEventArgs

Делегат RunWorkerCompletedEventHandler

Класс SByteConverter

Класс SingleConverter

Класс StringConverter

Класс SyntaxCheck

Класс TimeSpanConverter

Класс TypeConverter

Класс TypeDescriptionProvider

Класс TypeDescriptor

Класс TypeListConverter

Класс UInt16Converter

Класс UInt32Converter

Класс UInt64Converter

Класс WarningException

Класс Win32Exception

System.Diagnostics

Свойство Debug.Listeners

Свойство Trace.Listeners

Свойство EventLog.SynchronizingObject

Класс ConsoleTraceListener

Класс DefaultTraceListener

Класс DelimitedListTraceListener

Класс EventLogTraceListener

Класс PerformanceCounter

Класс PerformanceCounterCategory

Класс Process

Класс ProcessStartInfo

Класс TextWriterTraceListener

Класс TraceListener

Класс XmlWriterTraceListener

Свойство TraceSource.Listeners

System.IO

Метод Stream.Synchronized

Метод TextReader.Synchronized

Метод TextWriter.Synchronized

System.Reflection.Emit

Класс ConstructorBuilder

Класс EventBuilder

Класс FieldBuilder

Класс MethodBuilder

Класс CustomAttributeBuilder

Класс MethodRental

Класс ModuleBuilder

Класс PropertyBuilder

Класс TypeBuilder

Класс UnmanagedMarshal

System.Text

Метод Group.Synchronized

Метод Match.Synchronized

System.Threading

Класс AutoResetEvent

Класс EventWaitHandle

Класс ManualResetEvent

Класс Monitor

Класс Mutex

Класс ReaderWriterLock

Класс Semaphore

Метод Thread.AllocateNamedDataSlot

Метод Thread.BeginCriticalRegion

Метод Thread.EndCriticalRegion

Метод Thread.FreeNamedDataSlot

Метод Thread.GetData

Метод Thread.Join

Метод Thread.SetApartmentState

Метод Thread.SetData

Метод Thread.SpinWait

Метод Thread.Start

Метод Thread.TrySetApartmentState

Класс ThreadPool

Класс Timer

System.Timers

Класс Timer

System.Web.Configuration

Класс MachineKeyValidationConverter

System.Windows.Forms

Свойство AutoCompleteStringCollection.SyncRoot

Наборы разрешений SQL Server

SQL Server позволяет пользователям указывать требования к надежности кода, развернутого в базе данных. Если сборки выгружены в базу данных, автор сборки может указать один из трех наборов разрешений для этой сборки: SAFE, EXTERNAL-ACCESS или UNSAFE.

Набор разрешений

SAFE

EXTERNAL-ACCESS

UNSAFE

Управление доступом для кода

Только выполнение

Выполнение и доступ к внешним ресурсам

Unrestricted

Ограничения модели программирования

Да

Да

Без ограничений

Требование проверяемости

Да

Да

Нет

Возможность вызова машинного кода

Нет

Нет

Да

SAFE — это наиболее надежный и безопасный режим с соответствующими ограничениями в терминологии разрешенной модели программирования. Код SAFE имеет функциональные возможности высокой надежности и безопасности. Сборки SAFE имеют достаточно разрешений для выполнения, вычислений и имеют доступ к локальной базе данных. Сборки SAFE должны после проверки соответствовать безопасному типу и не могут вызывать неуправляемый код.

Режим EXTERNAL-ACCESS предоставляет промежуточный вариант безопасности. При его использовании код может получать доступ к внешним по отношению к базе данных ресурсам, однако имеет надежность и безопасность режима SAFE.

UNSAFE — это режим для кода с очень высоким уровнем доверия, который может быть создан только администраторами баз данных. Этот доверенный код не содержит ограничений на доступ кода и может вызывать неуправляемый (машинный) код.

В SQL Server используется уровень политики управления доступом для кода на уровне основного приложения для настройки политики основного приложения, предоставляющей один из трех наборов разрешений в зависимости от набора разрешений, хранящегося в каталогах SQL Server. Управляемый код, работающий внутри базы данных, всегда получает один из этих наборов разрешений доступа кода.

Ограничения модели программирования

Модель программирования для управляемого кода в SQL Server нуждается в функциях, процедурах и типах, которые не требует использования состояния различных вызовов или использования общего состояния различных пользовательских сеансов. Более того, как было описано ранее, присутствие общего состояния может привести к возникновению критических исключений, которые повлияют на масштабируемость и надежность приложения.

Учитывая эти условия, в SQL Server не разрешено использовать статические переменные и статические элементы данных. Для сборок SAFE и EXTERNAL-ACCESS SQL Server проверяет метаданные сборки во время CREATE ASSEMBLY и завершает создание таких сборок с ошибкой, если обнаружит использование статических элементов данных и статических переменных.

См. также

Ссылки

HostProtectionAttribute

HostProtectionResource