2012-01-18 5 views
2

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

someFieldValue == "someValue" 

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

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

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

Некоторые вещи, которые будут рассматриваться небезопасным:

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

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

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

+0

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

+0

Вы описываете пользователя, атакующего * себя *. Пользователям разрешается атаковать себя. Почему это дыра в безопасности? –

+1

Веб-сервер. Выражения вводятся клиентами, но с неограниченным доступом они могут вызвать хаос на сервере. На данный момент это просто для внутреннего использования, поэтому это не проблема, но в производстве это было бы неприемлемо. Однако AppDomain решил проблему. – tenfour

ответ

2

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

Assembly.CreateInstance and security

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

+2

Спасибо - я сейчас реализовал это, и действительно AppDomains именно то, что я ищу. Для тех, кто заинтересован, хорошим ресурсом является [эта статья] (http://msdn.microsoft.com/en-us/library/bb763046.aspx) – tenfour

Смежные вопросы