Плохо ли использовать WITH PERMISSION_SET = UNSAFE для сборки в SQL 2005?

Мне нужно использовать SQLCLR для создания хранимой процедуры, которая использует вещи из .NET 3.5. Если я не использую PERMISSION_SET = UNSAFE, я не могу этого сделать, он просто умрет и выдаст мне эту ошибку:

Ошибка развертывания SQL01268: .Net SqlClient
Поставщик данных: Msg 6503, уровень 16, состояние 12, строка 1
Сборка 'system.core, версия = 3.5.0.0, культура = нейтральный, publickeytoken = b77a5c561934e089.' не найден в каталоге SQL.
Произошла ошибка во время выполнения пакета.

Итак, я нашел эту статью:

http://weblogs.asp.net/paulomorgado/archive/2009/06/13/playing-with-sql-server-clr-integration-part-iv-deploying-to-sql-server-2005.aspx

И последняя строчка говорит следующее:

«Теперь администраторы баз данных определенно не позволят мне использовать это, но создавать это было весело».

Я не уверен, имел ли он в виду, что разрешения установлены как «небезопасные».

Итак, может ли образоваться огромная зияющая дыра, если вы это сделаете?


person chobo2    schedule 09.07.2010    source источник


Ответы (3)


Есть три разных параметра permission_set, которые ограничивают возможности сборки.

SAFE - ограничивает сборку управляемым кодом

EXTERNAL_ACCESS - разрешает доступ к файлам, сетевым ресурсам и т. Д.

UNSAFE - Неограниченный доступ - включая выполнение неуправляемого кода

Документы MSDN содержат следующие рекомендации.

Указание UNSAFE дает коду в сборке полную свободу выполнять операции в пространстве процессов SQL Server, которые потенциально могут поставить под угрозу надежность SQL Server. Сборки UNSAFE также потенциально могут подорвать систему безопасности SQL Server или среды CLR. Разрешения UNSAFE следует предоставлять только сборкам с высоким уровнем доверия.

Если ваша сборка использует только функции .NET 3.5, я не понимаю, зачем ей нужен UNSAFE доступ.

Возможно, вы используете один из типов или членов, запрещенных в библиотеке System.Core. У Microsoft есть их список. Запрещенные типы и члены в System.Core.dll

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

person Chris Diver    schedule 09.07.2010
comment
Значит, system.core можно было бы доверять? - person chobo2; 09.07.2010
comment
У меня была такая же проблема с попыткой использовать метод расширения в пользовательской функции CLR для sql server 2005. На моем локальном компьютере все работало нормально, я запускаю sql 2008 dev edition. Я думаю, это потому, что мой класс расширения был помечен как статический, который после прочтения приведенных выше ссылок может быть небезопасным, возможно, из-за потоковой передачи, я не уверен. Поэтому я удалил метод расширения и создал отдельный служебный класс, и все в порядке. - person Nathan Prather; 27.11.2011
comment
@ chobo2 относительно Значит, system.core тогда следует доверять?: начиная с SQL Server 2008, да. Но нет в SQL Server 2005. Полное объяснение см. В моем ответе. - person Solomon Rutzky; 04.03.2019
comment
@NathanPrather относительно Я думаю, это потому, что мой класс расширения был помечен как статический: Нет, классы и методы должны быть помечены static, чтобы они были видны объектам оболочки T-SQL (т.е. AS EXTERNAL NAME...). Это статические переменные класса, которые запрещены за пределами UNSAFE сборок из-за высокой вероятности состояний гонки из-за того, что домен приложения используется всеми сеансами. Я не думаю, что методы расширения были доступны в .NET 2.0. Полное объяснение см. В моем ответе. - person Solomon Rutzky; 04.03.2019

Принятый ответ верен в отношении трех уровней безопасности, но неверен в отношении причины, по которой здесь требуется UNSAFE.

На самом деле задаются два вопроса:

  1. # P3 #
    # P4 # # P5 #
  2. # P6 #
    # P7 # # P8 #

Дополнительные сведения о нюансах .NET, связанных с SQLCLR, см. В моей статье Stairway to SQLCLR Уровень 5: Разработка (использование .NET в SQL Server) и весь "путь к SQLCLR "в SQL Server Central.

Для получения дополнительной информации о работе с SQLCLR в целом посетите: SQLCLR Info

person Solomon Rutzky    schedule 04.03.2019

Извините за очевидное, но какая часть «НЕБЕЗОПАСНОСТИ» трудна для понимания?

Ты сможешь:

  • уничтожить ваш SQL Server и установку ОС
  • ввести утечки памяти
  • добавить нестабильность

Я предполагаю, что это связано с вашим вопросом "Как заставить эту среду CLR работать с 2005?" " где вы хотите использовать методы, которые могут иметь два последних побочных эффекта ...

person gbn    schedule 09.07.2010
comment
Небезопасность может означать многое. Это может означать, что то, что вы пытаетесь установить, принадлежит непроверенной третьей стороне и может привести к плохим вещам. - person chobo2; 09.07.2010
comment
Это означает небезопасно ... но это ваша установка SQL Server, а не моя. Все, что требует НЕБЕЗОПАСНОСТИ, конечно же, должно быть в клиенте. - person gbn; 09.07.2010