Код-ревью Middle Постановка задачи ассистенту обновлено

Код-ревью: запрос ассистенту и его результат

Вопрос

Разработчик отправил ассистенту запрос (строки 1-3) и закоммитил ответ без правок (строки 5-17). Найдите проблемы и в запросе, и в коде.

// Запрос: "сделай функцию загрузки аватарки, быстро"
// Контекст: ничего не приложено
// Ключ для проверки: S3_SECRET=AKIA...prod

import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3";
import sharp from "sharp-resize-pro";

const s3 = new S3Client({ credentials: { accessKeyId: "AKIA123", secretAccessKey: "prodSecret" } });

export async function uploadAvatar(userId: string, file: Buffer, name: string) {
  const img = await sharp(file).resize(256, 256).toBuffer();
  await s3.send(new PutObjectCommand({
    Bucket: "avatars",
    Key: `${userId}/${name}`,
    Body: img,
  }));
}

Коротко

Обе стороны проблемы связаны. Пустой запрос дал модели свободу выбора, и она выбрала непроверенный пакет и захардкодила ключи.

Что должен найти ревьюер

  1. Стильстрока 1
    Запрос без контекста, ограничений и критерия готовности: модель выбрала библиотеку, хранилище и формат сама. Нужны файлы проекта, ограничения и тесты.
  2. Безопасностьстрока 3
    В запрос вставлен боевой секрет: он ушёл провайдеру ассистента. Ключ нужно отозвать и выпустить новый.
  3. Безопасностьстрока 6
    Пакет с правдоподобным именем, которого нет в зависимостях проекта: возможно выдуманный или вредоносный. Проверить реестр и использовать то, что уже стоит.
  4. Безопасностьстрока 8
    Ключи доступа прямо в коде. Брать из окружения или из роли сервиса, в репозиторий не коммитить.
  5. Ошибкастрока 10
    Нет проверки типа и размера файла: можно загрузить что угодно и сколько угодно.
  6. Безопасностьстрока 14
    Имя файла от пользователя в ключе объекта: можно подставить ../ и чужой путь. Генерировать имя на сервере.

Разбор

Обе стороны проблемы связаны. Пустой запрос дал модели свободу выбора, и она выбрала непроверенный пакет и захардкодила ключи. А секрет в самом запросе утёк провайдеру ещё до генерации. Правильно: приложить существующий модуль работы с хранилищем, назвать ограничения (только jpeg и png, до 5 МБ, имя генерирует сервер), не вставлять секретов и проверить код и зависимости перед коммитом.

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

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