Код-ревью 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 для отсутствующих и чужих объектов.
Что должен найти ревьюер
- Безопасностьстрока 6BOLA: документ загружается по id без проверки, что он принадлежит пользователю или его организации.
- Безопасностьстрока 6Отдаётся JPA-сущность целиком: все поля, включая служебные. Нужен DTO ответа.
- Безопасностьстрока 10Сущность из тела запроса сохраняется целиком: mass assignment (владелец, организация, статус) и BOLA при записи.
- Безопасностьстрока 16Роль берётся из параметра запроса: любой передаст
role=ADMIN. Роль должна идти из аутентифицированного контекста (@PreAuthorize, SecurityContext). - Ошибкастрока 6
orElseThrow()без исключения 404 приведёт к 500.
Разбор
Исправление: метод сервиса, который ищет документ по id и организации пользователя, DTO для входа и выхода, проверка роли через Spring Security, 404 для отсутствующих и чужих объектов.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.