Код-ревью Middle Код-ревью и правила команды обновлено
Код-ревью: эндпоинт из пулреквеста, написанный с ИИ
Вопрос
Пулреквест «Добавить экспорт заказов пользователя в CSV». Код написан ассистентом, автор говорит, что тесты зелёные. Найдите проблемы.
import { stringify } from 'csv-stringify-fast';
// Экспортирует заказы пользователя в CSV
app.get('/api/orders/export', async (req, res) => {
const userId = req.query.userId;
const rows = await db.query(
`SELECT * FROM orders WHERE user_id = ${userId}`
);
try {
const csv = stringify(rows);
res.setHeader('Content-Type', 'text/csv');
res.send(csv);
} catch (e) {
console.log(e);
}
});
function formatDate(d: Date): string {
return d.toISOString().slice(0, 10);
}
Коротко
Код выглядит аккуратно, но в нём классический набор: выдуманная или подозрительная зависимость, доступ к чужим данным через параметр, SQL-инъекция, выгрузка всего подряд и проглоченная ошибка. Зелёные тесты этого не ловят, если тесты проверяют только счастливый путь.
Что должен найти ревьюер
- Безопасностьстрока 1Незнакомый пакет с похожим на популярный названием: проверить, что он существует, поддерживается и это не подделка. Возможно, ассистент его выдумал.
- Безопасностьстрока 5userId берётся из query: любой может выгрузить чужие заказы. Пользователь должен браться из сессии.
- Безопасностьстрока 7SQL собирается склейкой строк: инъекция. Нужен параметризованный запрос.
- Производительностьстрока 7SELECT * без лимита: выгрузит лишние колонки, включая внутренние, и может вернуть огромный объём за раз.
- Ошибкастрока 14Ошибка проглатывается: клиент не получит ответа и запрос повиснет. Нужен ответ с кодом ошибки.
- Стильстрока 18Неиспользуемая функция formatDate, к тому же в проекте, скорее всего, уже есть общий форматтер дат.
Разбор
Код выглядит аккуратно, но в нём классический набор: выдуманная или подозрительная зависимость, доступ к чужим данным через параметр, SQL-инъекция, выгрузка всего подряд и проглоченная ошибка. Зелёные тесты этого не ловят, если тесты проверяют только счастливый путь. Автор должен был заметить это сам до ревью.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.