Выбор ответа Middle Файлы и процессы обновлено
Инъекция команд через exec
Вопрос
Что не так в этом коде?
const { exec } = require('node:child_process');
app.post('/thumb', (req, res) => {
exec('convert ' + req.body.file + ' -resize 200 out.png', done);
});
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Command injection: a.png; rm -rf выполнится. exec передаёт строку в shell, и спецсимволы вроде ;, &&, $() выполнятся как команды.
Варианты ответа
- Ничего, convert сам проверит имя файла перед запуском
- Нужно использовать execSync, чтобы дождаться результата
- exec не работает внутри HTTP-обработчика Express
- Command injection:
a.png; rm -rf ~выполнитсяправильный ответ
Разбор
exec передаёт строку в shell, и спецсимволы вроде ;, &&, $() выполнятся как команды. Исправление: execFile("convert", [file, "-resize", "200", "out.png"]) без shell и проверка, что файл из разрешённой папки.
- convert получит строку уже после того, как shell выполнит инъекцию.
- exec работает где угодно.
execSyncтак же уязвим и ещё блокирует цикл.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.