Контекст
Код взят из Go-сервиса, который должен был временно складывать загруженные файлы в /tmp. Разработчик решил, что достаточно взять имя файла из запроса и отправить его в ioutil.TempFile. На ревью такое решение обязаны зарезать: злоумышленник может проставить ../../ в имени файла и заставить сервис писать куда угодно.
- Вспомни, как работает
ioutil.TempFileи что делает с шаблоном. - Важно указать строку точно — проверка автоматическая.
- После успешного ответа обсудим, как выглядит безопасный фикс.
Сниппет
Code Review
Референс-фигура
Принимаем файл, но шаблон для временного файла должен быть под нашим контролем. Вместо пользовательского имени используем собственный префикс и дополнительно нормализуем имя, если нам надо его сохранить.
Флаг после ревью: FLAG{go-tempfile-review}
safeName := filepath.Base(header.Filename)
// Отбрасываем директории и оставляем только имя.
// Создаём временный файл с безопасным шаблоном
tempFile, err := os.CreateTemp("/tmp", "upload-*")
if err != nil {
return err
}
defer tempFile.Close()
if _, err := io.Copy(tempFile, file); err != nil {
return err
}
// Дополнительно можно использовать safeName при переносе в постоянное хранилище.
Такой патч не позволит пользователю подложить путь. Если нужно использовать исходное имя, предварительно пропусти его через filepath.Base и собственную валидацию расширений.
Проверка флага
После ревью в отчёте команды нужно указать флаг. Введи его сюда, чтобы дашборд засчитал выполнение задания.