Безопасно ли выполнять введенные пользователем выражения как IronPython?

Я работаю над большим программным продуктом ASP.NET. Мы хотели бы разрешить пользователям вводить выражения, а не константы для определенных полей. Обычно что-то вроде:

(Price * 1.175) + 25

Очевидное решение, по-видимому, состоит в том, чтобы внедрить IronPython, создать Scope, передать переменные «Цена» (и другие) и затем выполнить вышеуказанное как код IronPython.

Однако ничто не помешает пользователям ввести:

1 / 0

or

def func1():
    func1()
func1()

or

import System.IO
File.Delete(....)

Но если я поймаю все исключения и запущу код IronPython в домене приложения с набором разрешений для Интернета, буду ли я в безопасности?


person d4nt    schedule 14.12.2009    source источник


Ответы (2)


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

person Cylon Cat    schedule 14.12.2009

В аналогичной ситуации я выбрал JScript на стороне сервера. Чтобы добавить еще один уровень защиты, я оборачиваю выражение в функцию, а затем выполняю функцию:

function generated123(p1, p2, p3) {
     return
     // user code goes here
     ;
}

Таким образом, пользователь не может принудительно импортировать что-либо опасное. Также компилируется JScript на стороне сервера, что хорошо для производительности.

person mfeingold    schedule 14.12.2009
comment
Просто мысль, если пользователь вводит 0;} /*злой код здесь*/ function dummyFunc () { return 0 Не могли бы они тогда заставить вас запустить их злой код? - person d4nt; 15.12.2009
comment
Неа. Сам скрипт не выполняется. Мой код вызывает только функцию generate123 - person mfeingold; 15.12.2009