Как сделать введенный пользователем код C # безопасным? - PullRequest
2 голосов
/ 18 января 2012

Я создаю функцию условного форматирования, в которой пользователь может ввести выражение, например

someFieldValue == "someValue"

. И мы применяем форматирование на основе результата этого выражения.Самый быстрый способ сделать это (с полнофункциональным синтаксисом выражений), кажется, с помощью CSharpCodeProvider.CompileAssemblyFromSource.

Поскольку выражение вводится пользователем, это огромная дыра в безопасности (например, пользовательмог бы ввести выражение someFieldValue == Process.Start("shutdown","/s /t 0")).

Вопрос: IF это было для производственной системы, как я могу убедиться, что введенное выражение не вызываетпроблемы?Прямо сейчас это просто внутренний инструмент, но на случай, если мы представим его производственной системе, я хочу подготовиться и не идти по пути (C # CodeDom) только для того, чтобы потом его удалить.

Некоторые вещи, которые будут рассмотреныunsafe:

  • Выход из приложения
  • Доступ / изменение локальных ресурсов, таких как файлы / реестр / системные настройки
  • Изменение объектов в памяти
  • Сбойвызывающий процесс
  • Запуск приложений
  • ...

Поскольку перечислять все то, что вы не можете , мое чувство нецелесообразнозаключается в том, что решение будет включать изменение введенного пользователем выражения, чтобы оно работало с прокси-объектом, который предоставляет все возможности, которые мы готовы предоставить выражению.Это будет означать, что в выражении не допускаются произвольные вызовы функций.Это также означает, что выражение больше не является стандартным кодом C #, и, в конце концов, для этого может оказаться более практичным использование другого синтаксиса языка.

Преимущества возможности использования C # заключаются в HUGE., потому что мы хотим разрешить «плагины» в C #, которые можно использовать в выражениях, и это обеспечивает хорошую бесшовную интеграцию с существующим кодом.Я согласен с тем, что одним из решений является использование языка сценариев, такого как javascript, но я бы хотел убедиться, что сначала мы должны исключить C #.

1 Ответ

2 голосов
/ 18 января 2012

Я думаю, вам стоит взглянуть на это;

Assembly.CreateInstance and security

Рекомендуемый подход для этого состоит в том, чтобы выполнить подозрительный код в песочница appdomain. Несколько причин приведены в http://blogs.msdn.com/b/shawnfa/archive/2006/04/19/579066.aspx, и еще более важным является то, что большинство других потенциальных подходов устарели с .NET 4.0.

...