Код-ревью Senior Моделирование угроз обновлено

Ревью: спецификация API перевода между счетами

Вопрос

Посмотрите на фрагмент спецификации API и найдите угрозы ещё до реализации.

paths:
  /api/transfers:
    post:
      summary: Перевод между счетами
      security: []
      requestBody:
        content:
          application/json:
            schema:
              properties:
                from_account: { type: string }
                to_account: { type: string }
                amount: { type: number }
                initiated_by: { type: string, description: "id пользователя" }
      responses:
        "200": { description: "Перевод выполнен, возвращает балансы обоих счетов" }

Коротко

Ревью спецификации дешёвая форма моделирования угроз: многие ошибки авторизации и логики видны ещё до кода. Хорошая практика: требования безопасности прямо в OpenAPI (security, ограничения схем, заголовок Idempotency-Key).

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

  1. Безопасностьстрока 5
    security: []: эндпоинт перевода без аутентификации.
  2. Безопасностьстрока 10
    from_account от клиента без требования проверить, что счёт принадлежит пользователю (BOLA, Spoofing).
  3. Безопасностьстрока 12
    amount типа number без ограничений: отрицательные суммы, ноль, дробные копейки, огромные значения. Нужны minimum, точность и лимиты.
  4. Безопасностьстрока 13
    initiated_by передаёт клиент: подмена инициатора и отказ от действия. Инициатор берётся из токена.
  5. Безопасностьстрока 15
    Ответ раскрывает баланс счёта получателя (Information disclosure).
  6. Безопасностьстрока 3
    Нет ключа идемпотентности: повтор запроса выполнит перевод дважды.

Разбор

Ревью спецификации дешёвая форма моделирования угроз: многие ошибки авторизации и логики видны ещё до кода. Хорошая практика: требования безопасности прямо в OpenAPI (security, ограничения схем, заголовок Idempotency-Key).

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

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