Безопасно ли выполнять введенные пользователем выражения как IronPython? - PullRequest
2 голосов
/ 14 декабря 2009

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

(Price * 1.175) + 25

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

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

1 / 0

или

def func1():
    func1()
func1()

или

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

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

Ответы [ 2 ]

4 голосов
/ 14 декабря 2009

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

0 голосов
/ 14 декабря 2009

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

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

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

...