Ограничения модели программирования на основе интеграции со средой CLR

При построении управляемой хранимой процедуры или другого управляемого объекта базы данных необходимо учитывать, что СУБД SQL Server выполняет определенные проверки программного кода. СУБД SQL Server проверяет сборку управляемого кода при ее первой регистрации в базе данных с помощью инструкции CREATE ASSEMBLY, а также во время выполнения. Управляемый код проверяется также во время выполнения, поскольку в сборке могут быть кодовые пути, фактически не достижимые во время выполнения. Благодаря этому достигается гибкость при регистрации сборок сторонних производителей, поскольку сборка не блокируется из-за наличия в ней «небезопасного» кода, предназначенного для выполнения в клиентской среде, но никогда не выполняющегося во внутрипроцессной среде CLR. Требования к управляемому коду зависят от того, зарегистрирована ли сборка как SAFE, EXTERNAL_ACCESS или UNSAFE; требования к SAFE являются самыми строгими и перечислены ниже.

Кроме ограничений, которые распространяются на сборки управляемого кода, им также предоставляются права доступа к коду. Среда CLR поддерживает модель безопасности, называемую управлением доступом для кода (CAS). В этой модели разрешения предоставляются сборкам на основе идентификатора кода. Сборки SAFE, EXTERNAL_ACCESS и UNSAFE имеют различные разрешения CAS. Дополнительные сведения см. в разделе Управление доступом для кода на основе интеграции со средой CLR.

Проверки CREATE ASSEMBLY

При запуске инструкции CREATE ASSEMBLY для каждого уровня безопасности выполняются следующие проверки. В случае неудачного завершения любой из проверок выполнение инструкции CREATE ASSEMBLY оканчивается неудачей с возвратом сообщения об ошибке.

Глобальная проверка (любой уровень безопасности)

Все сборки, на которые имеются ссылки, должны удовлетворять одному или нескольким из следующих критериев.

  • Сборка уже зарегистрирована в базе данных.

  • Сборка принадлежит к числу поддерживаемых сборок. Дополнительные сведения см. в разделе Поддерживаемые библиотеки платформы .NET Framework.

  • Используется инструкция CREATE ASSEMBLY FROM<location>, и все сборки, на которые имеются ссылки, а также объекты, от которых они зависят, доступны в <location>.

  • Используется инструкция CREATE ASSEMBLY FROM<bytes …>, и все ссылки заданы с помощью байтов, разделенных пробелами.

EXTERNAL_ACCESS

Все сборки EXTERNAL_ACCESS должны отвечать следующим требованиям.

  • Статические поля не используются для хранения информации. Допускаются статические поля только для чтения.

  • Тест PEVerify пройден успешно. Средство проверки PEVerify (peverify.exe), проверяющее соответствие кода MSIL и связанных с ним метаданных требованиям безопасности, поставляется в комплекте с пакетом разработчика .NET Framework SDK.

  • Синхронизация (например, с помощью класса SynchronizationAttribute) не используется.

  • Методы завершения не используются.

В сборках EXTERNAL_ACCESS запрещено использовать следующие настраиваемые атрибуты.

  • System.ContextStaticAttribute

  • System.MTAThreadAttribute

  • System.Runtime.CompilerServices.MethodImplAttribute

  • System.Runtime.CompilerServices.CompilationRelaxationsAttribute

  • System.Runtime.Remoting.Contexts.ContextAttribute

  • System.Runtime.Remoting.Contexts.SynchronizationAttribute

  • System.Runtime.InteropServices.DllImportAttribute

  • System.Security.Permissions.CodeAccessSecurityAttribute

  • System.Security.SuppressUnmanagedCodeSecurityAttribute

  • System.Security.UnverifiableCodeAttribute

  • System.STAThreadAttribute

  • System.ThreadStaticAttribute

SAFE

  • Проверяются все условия, относящиеся к сборкам EXTERNAL_ACCESS.

Проверки времени выполнения

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

UNSAFE

Не допускается загрузка сборки явным образом из массива байтов с помощью метода System.Reflection.Assembly.Load() или неявно с использованием пространства имен Reflection.Emit.

EXTERNAL_ACCESS

Проверяются все условия UNSAFE.

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

  • SelfAffectingProcessMgmt

  • SelfAffectingThreading

  • Synchronization

  • SharedState

  • ExternalProcessMgmt

  • ExternalThreading

  • SecurityInfrastructure

  • MayLeakOnAbort

  • UI

Дополнительные сведения об атрибутах защиты сервера и список запрещенных типов и элементов поддерживаемых сборок см. в разделе Атрибуты защиты узла и программирование средств интеграции со средой CLR.

SAFE

Проверяются все условия EXTERNAL_ACCESS.