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


Ограничения модели программирования на основе интеграции со средой 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 проверены.

Типы и методы, помеченные следующими значениями атрибутов защиты узла (host protection attribute, HPA) в поддерживаемом списке сборок, не допускаются.

  • SelfAffectingProcessMgmt

  • SelfAffectingThreading

  • Synchronization

  • SharedState

  • ExternalProcessMgmt

  • ExternalThreading

  • SecurityInfrastructure

  • MayLeakOnAbort

  • UI

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

SAFE

Все условия EXTERNAL_ACCESS проверены.