.NET DLR безопасный или изолированный сценарий - PullRequest
6 голосов
/ 19 февраля 2011

Я использую DLR в небольшой части более крупного проекта на C #, а именно язык IronPython.

Для некоторых частей системы пользователь может ввести небольшой скрипт для настройки поведения для них.Что я хотел бы сделать, так это уметь ограничивать их использованием чистых функций без побочных эффектов или в какой-то песочнице, чтобы их функция не могла ничего касаться снаружи.

Кроме того, пользователь может ввести только тело функции, заголовок функции и спецификация аргумента автоматически добавляются в код перед передачей в движок Python DLR, чтобы сторона C # системы, которая вызывает его, зналаименно арги, чтобы пройти и что возвращается.Пользователям потребуется только выполнять простые операции и тесты, основанные исключительно на значениях, предоставленных в качестве аргументов.

например,

это нормально: return (a * 100) > b;

это не нормально: delete_file_system(); return (a * 100) > b;

Как этого достичь?Есть ли более подходящий выбор языка или технологии?

1 Ответ

7 голосов
/ 19 февраля 2011

Способ сделать это - создать домен приложения в песочнице, а затем запустить скрипт в этом домене приложения.Инструкции по созданию изолированного домена вы можете найти здесь: http://msdn.microsoft.com/en-us/library/bb763046.aspx

Для запуска кода в домене приложения вы можете использовать перегрузку Python.CreateEngine, которая принимает AppDomain.Тогда весь код, выполняемый в этом движке, будет работать в этом домене приложения.

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

В ObjectOperations есть также множество API-интерфейсов и ScriptScope - классов, которые работают с ObjectHandles для выполнения операций.на объекты в удаленном домене.

...