📚 Теория: @Validated + Regex DoS (раскрыть)
Без @Validated проверки не работают
Bean Validation для @RequestParam включается только при аннотации контроллера @Validated. Здесь её нет — опасный ввод добирается до сервиса.
⚠️ Да даже если бы была, регексп всё равно ReDoS.
Сложные регекспы
Выражение ([\\w\\s]+\\.?)+ имеет вложенные квантификаторы. Длинная строка приводит к экспоненциальному времени.
🔐 Используй простые whitelist-выражения или предикаты.
Хакер отправляет q=aaaaaaaa....!, где 50k символов.
Регексп зависает, блокируя event-loop/пул потоков.
Сервис поиска недоступен, Alertmanager молчит (HTTP 200).
Как надо: включи @Validated, проверь длину через @Size, перепиши фильтрацию на precompiled DFA-дружелюбный шаблон, добавь circuit breaker и тесты.
Контекст
Поиск клиентов — критичный API. Для «гибкости» взяли сложный регексп из StackOverflow. Ограничения длины не добавили, а @Validated забыли. Теперь у злоумышленника есть стабильный DoS.
- Проверь строку с
@Pattern, посмотри на структуру выражения. - Добавь в рекомендацию:
@Validatedна классе,@Size(max = 64)и безопасный регексп. - Предложи тесты: `MockMvc` с `q` из 10k символов + профилирование времени отклика.
Сниппет
Code Review
Референс-исправление
Включи Bean Validation, ограничь длину и перепиши матчинг на whitelist.
Флаг ревью: FLAG{java-redos-search}
@Validated
@RestController
@RequestMapping("/api/v1/search")
public class SearchController {
@GetMapping
public List<UserDto> search(
@RequestParam("q")
@Size(max = 64)
@Pattern(regexp = "^[A-Za-z0-9\\-\\s]+$")
String query
) { ... }
}
Добавь тесты с ReDoS-инпутом, интеграцию с `curl --max-time`, мониторинг задержек и rate-limit на IP.
Проверка флага
После ревью зафиксируй флаг, чтобы дашборд засчитал лабораторию.