Код-ревью 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, отсутствие авторизации и ПДн в логах.

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

  1. Безопасностьстрока 5
    Логин и пароль боевой базы прямо в коде. Строку подключения брать из переменных окружения, пароль сменить: он уже в истории.
  2. Безопасностьстрока 12
    SQL собирается конкатенацией из query-параметра: SQL-инъекция. Нужен параметризованный запрос с $1.
  3. Безопасностьстрока 10
    Нет аутентификации и проверки прав: любой узнает заказы по чужому email.
  4. Безопасностьстрока 14
    В лог пишутся email и все поля заказов: персональные данные в логах. Логировать только идентификаторы и количество.
  5. Производительностьстрока 12
    SELECT * без лимита: отдаёт лишние поля и может вернуть огромный список. Выбрать нужные колонки и добавить пагинацию.
  6. Ошибкастрока 13
    Нет обработки ошибок: исключение из pool.query не превратится в понятный ответ 500, запрос может повиснуть.

Разбор

Типичный набор ошибок сгенерированного кода: работает на демо, но небезопасен. Секрет в исходнике, конкатенация SQL, отсутствие авторизации и ПДн в логах. Такой код нельзя принимать, даже если он «заработал»: ассистент решал задачу «чтобы отвечало», а не «чтобы было безопасно».

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

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