Я создаю функцию условного форматирования, в которой пользователь может ввести выражение, например
someFieldValue == "someValue"
. И мы применяем форматирование на основе результата этого выражения.Самый быстрый способ сделать это (с полнофункциональным синтаксисом выражений), кажется, с помощью CSharpCodeProvider.CompileAssemblyFromSource
.
Поскольку выражение вводится пользователем, это огромная дыра в безопасности (например, пользовательмог бы ввести выражение someFieldValue == Process.Start("shutdown","/s /t 0")
).
Вопрос: IF это было для производственной системы, как я могу убедиться, что введенное выражение не вызываетпроблемы?Прямо сейчас это просто внутренний инструмент, но на случай, если мы представим его производственной системе, я хочу подготовиться и не идти по пути (C # CodeDom) только для того, чтобы потом его удалить.
Некоторые вещи, которые будут рассмотреныunsafe:
- Выход из приложения
- Доступ / изменение локальных ресурсов, таких как файлы / реестр / системные настройки
- Изменение объектов в памяти
- Сбойвызывающий процесс
- Запуск приложений
- ...
Поскольку перечислять все то, что вы не можете , мое чувство нецелесообразнозаключается в том, что решение будет включать изменение введенного пользователем выражения, чтобы оно работало с прокси-объектом, который предоставляет все возможности, которые мы готовы предоставить выражению.Это будет означать, что в выражении не допускаются произвольные вызовы функций.Это также означает, что выражение больше не является стандартным кодом C #, и, в конце концов, для этого может оказаться более практичным использование другого синтаксиса языка.
Преимущества возможности использования C # заключаются в HUGE., потому что мы хотим разрешить «плагины» в C #, которые можно использовать в выражениях, и это обеспечивает хорошую бесшовную интеграцию с существующим кодом.Я согласен с тем, что одним из решений является использование языка сценариев, такого как javascript, но я бы хотел убедиться, что сначала мы должны исключить C #.