Spring Boot应用如何拦截防范路径扫描类异常非法请求
Spring Boot拦截恶意扫描请求解决方案
你可以通过以下几种方案实现拦截,按实现复杂度和灵活度区分:
- 路径白名单/黑名单配置
如果你的业务接口有统一前缀(例如/api/v1/**),可以直接配置Spring MVC只放行匹配白名单前缀的请求,其余所有路径直接返回404/403。如果没有统一前缀,可维护恶意路径黑名单,命中规则的请求直接拦截。 - Servlet全局过滤器实现
这是兼容性最高的方案,不依赖其他组件即可实现全局拦截,代码示例如下:- 自定义拦截过滤器
import jakarta.servlet.*; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List; public class MaliciousRequestFilter implements Filter { // 可根据实际扫描特征扩展拦截的路径前缀/关键词 private static final List<String> BLOCKED_RULES = List.of( "/bin", "/.env", "/vendor", "/phpmyadmin", "/wp-admin", "/.git", "/phpunit" ); @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { String requestUri = ((HttpServletRequest) request).getRequestURI(); boolean needBlock = BLOCKED_RULES.stream().anyMatch(requestUri::startsWith); if (needBlock) { ((HttpServletResponse) response).setStatus(HttpServletResponse.SC_NOT_FOUND); return; } chain.doFilter(request, response); } }- 注册过滤器到Spring容器
import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class FilterConfig { @Bean public FilterRegistrationBean<MaliciousRequestFilter> maliciousFilterRegistration() { FilterRegistrationBean<MaliciousRequestFilter> bean = new FilterRegistrationBean<>(); bean.setFilter(new MaliciousRequestFilter()); bean.addUrlPatterns("/*"); bean.setOrder(Integer.MIN_VALUE); // 设置最高优先级,先于业务过滤器执行 return bean; } } - Spring Security规则配置
如果你已经接入了Spring Security组件,可以直接在安全规则里添加拦截配置,不用额外写过滤器:import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.web.SecurityFilterChain; @Configuration public class SecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http.authorizeHttpRequests(auth -> auth .requestMatchers("/bin/**", "/.env", "/vendor/**", "/phpmyadmin/**", "/wp-admin/**").denyAll() // 此处添加你自己的业务路径放行规则 .anyRequest().authenticated() ); return http.build(); } } - 前置层拦截优化
如果恶意请求量级很大,建议优先在Nginx等反向代理层配置规则拦截,不用把请求转发到后端Spring Boot服务,能进一步降低服务资源消耗。
另外你可以关闭Spring Boot默认的Whitelabel错误页,避免泄露服务框架信息给扫描器,application.yml配置如下:
server: error: whitelabel: enabled: false
内容的提问来源于stack exchange,提问作者Abraham Arnold
相关产品推荐
相关产品推荐

