Использование сборки сборки из источника для оценки математических уравнений в C # - PullRequest
2 голосов
/ 10 мая 2009

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

Спасибо

C # .net 2.0, winforms

Ответы [ 4 ]

5 голосов
/ 10 мая 2009

Проблема с этим подходом состоит в том, что пользователь может ввести любой код, который он хочет (если вы не очистите его). Они могут вставить код, чтобы стереть все ваши файлы. Если это выполняется на сервере, не делает это. Кроме того, даже на настольном компьютере запуск компилятора для оценки уравнения очень медленный. Создайте грамматику для ваших уравнений с помощью инструмента, подобного ANTLR , и вставьте анализатор в вашу программу.

4 голосов
/ 11 мая 2009

Некоторое время назад я наткнулся на умный способ сделать это: воспользоваться функцией eval JScript. Вы можете создать простой класс JScript:

  class JsMath
  {
    static function Eval(MathExpression : String) : double
    {
      return eval(MathExpression);
    };
  }

Скомпилируйте это так:

jsc / target: библиотека JsMath.js

Теперь вы можете просто ссылаться на библиотеку JsMath и использовать метод JsMath.Eval.

2 голосов
/ 11 мая 2009

Если «уравнения» C # можно сохранять и обменивать между пользователями, то, безусловно, существует угроза безопасности. Пользователь может поместить в уравнение вредоносный код и заставить его совершать плохие поступки на машинах других пользователей. Или пользователь может быть просто обманут, введя вредоносное «уравнение» (вспомните старую alt + F4 шалость здесь).

К счастью, вы можете безопасно разместить ненадежный код в песочнице .NET. Общая идея заключается в том, что вы создаете отдельный AppDomain (с методом AppDomain.CreateDomain ), который имеет только минимальные разрешения, а затем загружаете и запускаете там код пользователя.

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

2 голосов
/ 10 мая 2009

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

Мне любопытно, почему вы выбираете такой подход. Простые математические уравнения имеют довольно строгую грамматику и очень легко разбираются. Я уверен, что есть несколько бесплатных библиотек, и если вы не пишете свои собственные, это не большое дело. Это, вероятно, будет намного быстрее, чем отправка компилятору для проверки синтаксиса математического выражения.

...