Есть ли какие-либо эксплойты безопасности, которые могут произойти в этом сценарии:
eval(repr(unsanitized_user_input), {"__builtins__": None}, {"True":True, "False":False})
где unsanitized_user_input
- объект str. Строка генерируется пользователем и может быть неприятной. Предполагая, что наш веб-фреймворк не подвел нас, это настоящий честный пример от встроенных Python.
Если это опасно, можем ли мы что-нибудь сделать для ввода, чтобы сделать его безопасным?
Мы определенно не хотим выполнять что-либо содержащееся в строке.
Смотри также:
Более широкий контекст, который (я считаю) не существенен для вопроса, состоит в том, что у нас их тысячи:
repr([unsanitized_user_input_1,
unsanitized_user_input_2,
unsanitized_user_input_3,
unsanitized_user_input_4,
...])
в некоторых случаях вложенный:
repr([[unsanitized_user_input_1,
unsanitized_user_input_2],
[unsanitized_user_input_3,
unsanitized_user_input_4],
...])
, которые сами преобразуются в строки с repr()
, помещаются в постоянное хранилище и в конечном итоге считываются в память с помощью eval.
Eval десериализовал строки из постоянного хранилища намного быстрее, чем pickle и simplejson. Интерпретатор Python 2.5, поэтому json и ast не доступны. Модули C не допускаются, а cPickle не допускается.