C# Load Sandboxed Assembly
Итак, у меня есть приложение, которое я хочу добавить поддержку других людей для написания модулей, которые приложение будет загружать.
Модули - это класс, расширяющий мой класс Module, написанный на.Net. Мне нужно знать, как загрузить эти библиотеки DLL в изолированную среду, позволяя им только чтение / запись в определенных каталогах.
Это возможно?
1 ответ
Да, это возможно. Использование Code Access Security и.NET Sandbox. Я бы посоветовал вам взглянуть на библиотеку CSScript (с открытым исходным кодом). Это библиотека, которая предоставляет сценарии C# и компиляцию на лету в динамические сборки. Я использовал это в проекте, чтобы позволить конечным пользователям писать сценарии на C# и выполнять их, позволяя взаимодействовать с классами в моей системе. Проект требовал, чтобы у них не было доступа к File IO или MessageBox (UI), поскольку пользовательские сценарии должны были выполняться на сервере. CSSCript использовал элементы.NET Framework для ограничения доступа к сборке, и вы получите исключение, если будет вызван любой из этих запрещенных типов.
Итак, взгляните на это. Я отредактирую свой ответ, как только узнаю некоторые подробности о том, как это возможно, просто чтобы вы знали, что это возможно!
Хорошо нашел это. Вот обсуждение, которое я провел с автором CSScript несколько лет назад:
Мне:
Я разрабатываю приложение и хочу предоставить пользователям возможность создавать сценарии определенных действий через пользовательский интерфейс. CSScript выглядит очень хорошо для этого. Однако я также хочу позволить пользователям делать это и выполнять свои сценарии на веб-сервере. Теперь это кошмар безопасности, так как пользователи могут написать "Directory.Delete(@"C:\", true) и стереть жесткий диск. Так можно ли было бы ограничить сборки, пространства имен или даже классы, к которым пользователь может получить доступ из своего скрипта, для запуска CSScript в защищенной песочнице?
Олег:
Непосредственным привлекательным решением является использование.NET Sandbox. Он разработан именно для такого рода сценариев. Стандартная песочница CLR доступна для хост-приложения, выполняющего сценарии с CS-Script. Идея состоит в том, что вы инициализируете CAS перед загрузкой подозрительного скрипта, а остальное входит в обязанности CLR. И если вам нужно настроить права доступа к каталогам / файлам, вы делаете это с помощью инструментов CAS. Таким образом, сценарии являются "транспортировкой" для рутины, предоставляемой вашим пользователем. А CS-Script - это удобный механизм для реализации такого транспорта, но фактические проблемы безопасности решаются с помощью.NET Sendoxing, который имеет полный набор функций, охватывающих практически все возможные сценарии безопасности. В загружаемых CS-сценариях вы можете найти образец Sendboxing (\Samples\Sandboxing), который демонстрирует, как предотвратить сценарий от операций ввода-вывода из файла (например, создать файл).
Итак, из этого я считаю, что вам нужно взглянуть на.NET Sandbox и загрузить в него сборки. Я понимаю, что этот пример относится только к C# Scripting, но я верю, что он применим к вашему сценарию, так как приведенные выше примеры CSScript покажут вам способ достижения песочницы и безопасности.
Некоторые конкретные примеры загрузки сборок в песочницу можно найти здесь:
- Загрузка сборок.NET в песочнице
- Code Access Security на практике
- Как использовать CAS для ограничения сборки
Пока мы обсуждали загрузку модулей, вы слышали о Microsoft Prism? Это обеспечивает хорошую основу для загрузки модулей и внедрения зависимостей (через Unity или MEF), что может быть очень полезно при разработке архитектуры плагинов.
С наилучшими пожеланиями,