программирование 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.

Набор разрешений SAFE EXTERNAL-ACCESS UNSAFE
Управление доступом для кода Только выполнение Выполнение и доступ к внешним ресурсам С неограниченным доступом
Ограничения модели программирования Да Да Без ограничений
Требование к проверяемости Да Да Нет
Возможность вызова машинного кода No No Да

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

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

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

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

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

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

Исходя из этого, SQL Server не поддерживает использование статических переменных и статических членов данных. Для сборок с разрешениями SAFE и EXTERNAL-ACCESS SQL Server проверяет метаданные сборки во время СОЗДАНИЯ СБОРКИ и возвращает состояние сбоя, если в ней используются статические переменные и члены данных.

См. также