Код-ревью Middle Безопасность и право спрашивают часто обновлено
Код-ревью: обработчик, который написал ассистент
Вопрос
Ассистент по просьбе «сделай эндпоинт поиска заказов по email» выдал такой код на Node.js. Найдите проблемы перед мержем.
const express = require('express');
const { Pool } = require('pg');
const pool = new Pool({
connectionString: 'postgres://admin:Qwerty123@db.prod.internal:5432/shop',
});
const app = express();
app.get('/orders', async (req, res) => {
const email = req.query.email;
const sql = `SELECT * FROM orders WHERE email = '${email}'`;
const result = await pool.query(sql);
console.log('orders for', email, result.rows);
res.json(result.rows);
});
app.listen(3000);
Коротко
Типичный набор ошибок сгенерированного кода: работает на демо, но небезопасен. Секрет в исходнике, конкатенация SQL, отсутствие авторизации и ПДн в логах.
Что должен найти ревьюер
- Безопасностьстрока 5Логин и пароль боевой базы прямо в коде. Строку подключения брать из переменных окружения, пароль сменить: он уже в истории.
- Безопасностьстрока 12SQL собирается конкатенацией из query-параметра: SQL-инъекция. Нужен параметризованный запрос с $1.
- Безопасностьстрока 10Нет аутентификации и проверки прав: любой узнает заказы по чужому email.
- Безопасностьстрока 14В лог пишутся email и все поля заказов: персональные данные в логах. Логировать только идентификаторы и количество.
- Производительностьстрока 12SELECT * без лимита: отдаёт лишние поля и может вернуть огромный список. Выбрать нужные колонки и добавить пагинацию.
- Ошибкастрока 13Нет обработки ошибок: исключение из pool.query не превратится в понятный ответ 500, запрос может повиснуть.
Разбор
Типичный набор ошибок сгенерированного кода: работает на демо, но небезопасен. Секрет в исходнике, конкатенация SQL, отсутствие авторизации и ПДн в логах. Такой код нельзя принимать, даже если он «заработал»: ассистент решал задачу «чтобы отвечало», а не «чтобы было безопасно».
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.