Выбор ответа Senior Стандартная библиотека обновлено

Безопасный вызов внешней команды

Вопрос

Как безопасно вызвать convert с именем файла от пользователя?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: subprocess.run(["convert", path, "out.png"], check=True). Список аргументов передаётся программе напрямую без оболочки, поэтому имя файла вида x; rm -rf останется просто именем.

Варианты ответа

  1. subprocess.run(["convert", path, "out.png"], check=True)правильный ответ
  2. os.system(f"convert '{path}' out.png") с путём в кавычках
  3. subprocess.run(f"convert {path} out.png", shell=True, check=True)
  4. eval(f"convert {path}")

Разбор

Список аргументов передаётся программе напрямую без оболочки, поэтому имя файла вида x; rm -rf ~ останется просто именем. Строка с shell=True или os.system интерпретируется оболочкой, и это инъекция команд. check=True превращает ненулевой код возврата в исключение. eval вообще выполняет Python-код и здесь бессмыслен и опасен.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.