Как избежать угрозы безопасности exec () - PullRequest
0 голосов
/ 03 октября 2018

Я делаю тестовый проект веб-сервиса, где мне нужно создать некоторые динамические переменные.Чтобы реализовать это, у меня нет выбора, кроме как использовать функцию exec (), например: follow.

    for parameter in parameter_names:
        if parameter["type"] == "number":
            exec("%s= %s(request.args.get('%s'))"%(parameter["name"],"float",parameter["name"]))
            para_collection[parameter["name"]] = eval(parameter["name"])
        else:
            exec("%s= %s(request.args.get('%s'))"%(parameter["name"],"str",parameter["name"]))
            para_collection[parameter["name"]] = eval(parameter["name"])

Здесь я принимаю значения из веб-вызова и присваиваю их именам динамических переменных. Даже если этот код дает мне ожидаемыйВ результате я видел количество сообщений в StackOverflow, в которых упоминались угрозы безопасности функции exec ().Поэтому я хотел бы оценить этот код на предмет безопасности.

Какие сценарии мне нужно протестировать?Если не exec (), каковы альтернативы?

1 Ответ

0 голосов
/ 03 октября 2018

Вам необходимо подтвердить, что parameter["name"] безопасен.Лучший способ сделать это - внести в белый список набор значений, которые могут быть предоставлены пользователем.Таким образом, злоумышленник может совершить множество опасных действий с вашим кодом, особенно удаленное выполнение кода.

Пример: злоумышленник отправляет import os\nos.system("rm -rf *") # для parameter["name"] (при условии, что ОС Linux, но атака может бытьадаптирован под другие ОС).Ой, вы теряете много данных.

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

Какой формат может принимать ваш parameter["name"]?Если оно только буквенно-цифровое, то проверка может быть регулярным выражением, которое проверяет, соответствуют ли значения буквенно-цифровому шаблону.Если нет, верните ошибку 400 пользователю.Если допустимо, разрешите выполнение команды.

См. Руководство: Безопасное кодирование: понимание проверки ввода .

...