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


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

Область применения: SQL Server Управляемый экземпляр SQL Azure

При создании управляемой хранимой процедуры или другого объекта управляемой базы данных SQL Server выполняет определенные проверки кода, которые необходимо учитывать. Эти проверки выполняются в сборке управляемого кода при первой регистрации в базе данных с помощью CREATE ASSEMBLY инструкции, а также во время выполнения. Управляемый код также проверяется во время выполнения, так как в сборке могут быть пути кода, которые никогда не могут быть достигнуты во время выполнения.

Эти проверки кода обеспечивают гибкость регистрации сторонних сборок, особенно поэтому сборка не блокируется, где небезопасный код, предназначенный для выполнения в клиентской среде, но никогда не будет выполняться в размещенной среде CLR. Требования, которые должен соответствовать управляемому коду, зависят от того, зарегистрирована ли сборка как SAFE, EXTERNAL_ACCESSили UNSAFE. SAFE является самым строгим уровнем безопасности.

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

Если задана политика издателя, CREATE ASSEMBLY завершается ошибкой.

Проверка СБОРКИ CREATE

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

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

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

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

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

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

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

EXTERNAL_ACCESS

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

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

  • Передается тест PEVerify. Средство PEVerify (peverify.exe), которое проверяет, что код общего промежуточного языка (CIL) и связанные метаданные соответствуют требованиям безопасности типа, предоставляется пакетом SDK для платформа .NET Framework.

  • Синхронизация, например с классом 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

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

SAFE

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