Код-ревью Middle OWASP Top 10 и API Top 10 обновлено

Ревью: эндпоинт профиля на Express

Вопрос

Найдите проблемы безопасности в обработчиках API.

app.get('/api/users/:id', auth, async (req, res) => {
  const user = await db.users.findById(req.params.id);
  res.json(user);
});

app.patch('/api/users/:id', auth, async (req, res) => {
  try {
    await db.users.update(req.params.id, req.body);
    res.json({ ok: true });
  } catch (e) {
    res.status(500).json({ error: e.stack });
  }
});

Коротко

Типичный набор API-проблем из OWASP API Top 10: BOLA, лишние свойства в ответе, mass assignment и неправильная обработка ошибок. Исправление: проверка владельца или роли в каждом обработчике (лучше централизованно), DTO для входа и выхода, общий обработчик ошибок.

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

  1. Безопасностьстрока 2
    BOLA: нет проверки, что req.params.id совпадает с текущим пользователем или что у него есть право смотреть чужой профиль.
  2. Безопасностьстрока 3
    Отдаётся весь объект из базы: хеш пароля, внутренние флаги и другие лишние поля. Нужен явный список полей ответа (DTO).
  3. Безопасностьстрока 8
    Mass assignment: req.body целиком пишется в базу, можно поменять role, balance, email_verified. Нужен allowlist полей.
  4. Безопасностьстрока 8
    Та же BOLA при записи: можно изменить чужого пользователя.
  5. Безопасностьстрока 11
    Стектрейс уходит клиенту: раскрывает пути, версии и структуру. Логировать на сервере, клиенту общий текст и id ошибки.

Разбор

Типичный набор API-проблем из OWASP API Top 10: BOLA, лишние свойства в ответе, mass assignment и неправильная обработка ошибок. Исправление: проверка владельца или роли в каждом обработчике (лучше централизованно), DTO для входа и выхода, общий обработчик ошибок.

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

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