Выбор ответа Senior Стандартная библиотека обновлено
Безопасный вызов внешней команды
Вопрос
Как безопасно вызвать convert с именем файла от пользователя?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: subprocess.run(["convert", path, "out.png"], check=True). Список аргументов передаётся программе напрямую без оболочки, поэтому имя файла вида x; rm -rf останется просто именем.
Варианты ответа
subprocess.run(["convert", path, "out.png"], check=True)правильный ответos.system(f"convert '{path}' out.png")с путём в кавычкахsubprocess.run(f"convert {path} out.png", shell=True, check=True)eval(f"convert {path}")
Разбор
Список аргументов передаётся программе напрямую без оболочки, поэтому имя файла вида x; rm -rf ~ останется просто именем. Строка с shell=True или os.system интерпретируется оболочкой, и это инъекция команд. check=True превращает ненулевой код возврата в исключение. eval вообще выполняет Python-код и здесь бессмыслен и опасен.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.