Код-ревью Middle Авторизация: IDOR, RBAC, ABAC обновлено

Ревью: контроллер документов на Spring

Вопрос

Найдите проблемы авторизации в контроллере.

@RestController
@RequestMapping("/api/documents")
public class DocumentController {
    @GetMapping("/{id}")
    public Document get(@PathVariable Long id) {
        return repo.findById(id).orElseThrow();
    }

    @PutMapping("/{id}")
    public Document update(@PathVariable Long id, @RequestBody Document body) {
        body.setId(id);
        return repo.save(body);
    }

    @DeleteMapping("/{id}")
    public void delete(@PathVariable Long id, @RequestParam String role) {
        if (role.equals("ADMIN")) repo.deleteById(id);
    }
}

Коротко

Исправление: метод сервиса, который ищет документ по id и организации пользователя, DTO для входа и выхода, проверка роли через Spring Security, 404 для отсутствующих и чужих объектов.

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

  1. Безопасностьстрока 6
    BOLA: документ загружается по id без проверки, что он принадлежит пользователю или его организации.
  2. Безопасностьстрока 6
    Отдаётся JPA-сущность целиком: все поля, включая служебные. Нужен DTO ответа.
  3. Безопасностьстрока 10
    Сущность из тела запроса сохраняется целиком: mass assignment (владелец, организация, статус) и BOLA при записи.
  4. Безопасностьстрока 16
    Роль берётся из параметра запроса: любой передаст role=ADMIN. Роль должна идти из аутентифицированного контекста (@PreAuthorize, SecurityContext).
  5. Ошибкастрока 6
    orElseThrow() без исключения 404 приведёт к 500.

Разбор

Исправление: метод сервиса, который ищет документ по id и организации пользователя, DTO для входа и выхода, проверка роли через Spring Security, 404 для отсутствующих и чужих объектов.

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

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