Код-ревью Senior Spring Security обновлено
Код-ревью: конфигурация безопасности
Вопрос
Найдите уязвимости в конфигурации и коде.
@Configuration
@EnableMethodSecurity
public class SecurityConfig {
@Bean
SecurityFilterChain chain(HttpSecurity http) throws Exception {
return http
.csrf(c -> c.disable())
.cors(c -> c.configurationSource(req -> {
CorsConfiguration cfg = new CorsConfiguration();
cfg.addAllowedOriginPattern("*");
cfg.setAllowCredentials(true);
cfg.addAllowedMethod("*");
return cfg;
}))
.authorizeHttpRequests(a -> a
.requestMatchers("/api/**").authenticated()
.requestMatchers("/api/admin/**").hasRole("ADMIN")
.requestMatchers("/actuator/**").permitAll()
.anyRequest().permitAll())
.formLogin(Customizer.withDefaults())
.build();
}
@Bean
PasswordEncoder encoder() {
return NoOpPasswordEncoder.getInstance();
}
}
Коротко
Конфигурация безопасности должна закрывать всё по умолчанию и открывать точечно, узкие правила ставятся выше широких. CSRF выключают только для чисто токенного API, CORS разрешает конкретные origin, пароли хранятся хешем BCrypt или Argon2, Actuator закрыт.
Что должен найти ревьюер
- Безопасностьстрока 7CSRF выключен, хотя используется formLogin с сессионной cookie: сайт-злоумышленник сможет отправлять изменяющие запросы от имени пользователя.
- Безопасностьстрока 10Любой origin с credentials: любой сайт сможет делать запросы с cookie пользователя и читать ответы. Нужен список доверенных origin.
- Безопасностьстрока 16Широкое правило /api/** стоит выше /api/admin/**: админские эндпоинты доступны любому вошедшему.
- Безопасностьстрока 18Все эндпоинты Actuator открыты без аутентификации, включая env и heapdump.
- Безопасностьстрока 19anyRequest().permitAll(): всё, что не перечислено, открыто. Безопаснее закрывать по умолчанию.
- Безопасностьстрока 26NoOpPasswordEncoder хранит пароли открытым текстом. Нужен BCrypt или делегирующий encoder.
Разбор
Конфигурация безопасности должна закрывать всё по умолчанию и открывать точечно, узкие правила ставятся выше широких. CSRF выключают только для чисто токенного API, CORS разрешает конкретные origin, пароли хранятся хешем BCrypt или Argon2, Actuator закрыт.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.