Поделиться через


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

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

Замечание

Безопасность доступа к коду (CAS) устарела во всех версиях платформ .NET Framework, и .NET. Последние версии .NET не учитывают заметки CAS и создают ошибки, если используются API, связанные с CAS. Разработчики должны искать альтернативные средства выполнения задач безопасности.

Атрибуты защиты хоста

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

  • Во всем остальном являются безопасными.

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

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

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.

Набор разрешений БЕЗОПАСНЫЙ EXTERNAL-ACCESS ОПАСНЫЙ
Безопасность доступа к коду Только выполнение Выполнение и доступ к внешним ресурсам Неограниченный
Ограничения модели программирования Да Да Ограничения отсутствуют
Требование к проверяемости Да Да нет
Возможность вызова машинного кода нет нет Да

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

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

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

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

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

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

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

См. также