sqlinjectinterceptor 不是 spring boot 3 的推荐方案,应采用分层防御:优先使用 preparedstatement 和 #{} 参数化查询,禁用 ${};请求层过滤应使用 @webfilter 而非 handlerinterceptor,并覆盖 json、文件上传等全场景。

SqlInjectInterceptor 不是 Spring Boot 3 的推荐方案,直接写拦截器做 SQL 注入过滤既低效又容易漏判——它只能拦住 URL 参数里的显式攻击字符串,对 JSON Body、Header、Path Variable、文件上传字段完全无效,且正则误杀率高(比如用户昵称含 or 就被拦)。
真正该做的,是分层防御,把力气用在刀刃上。
优先用 PreparedStatement 和 #{} 替代字符串拼接
这是最根本的防线。Spring Boot 3 默认使用的 MyBatis 3.4+、JdbcTemplate、Spring Data JPA 全部原生支持参数化查询。
-
#{}(MyBatis)会走预编译,${}是字符串拼接,禁用所有${}除非明确需要动态表名或 order by 字段 - JDBC 原生写法必须用
PreparedStatement,禁止Statement+String.format或+拼接 SQL - Spring Data JPA 的
@Query注解里,参数一律用:name绑定,不用+拼条件
如果非要加请求层过滤,用 Filter 而非 HandlerInterceptor
HandlerInterceptor.preHandle() 只能拿到已解析的 getParameterMap(),拿不到原始请求体(如 POST JSON),而 Filter 可以在 Servlet 容器最前端介入,还能重写 HttpServletRequestWrapper 对 body 做统一清洗。
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- 用
@WebFilter(urlPatterns = "/*")注册,确保覆盖所有入口(包括静态资源路径外的所有请求) - 不要只扫
getParameterNames(),必须同时处理:getInputStream()(JSON)、getReader()(XML/纯文本)、getPart()(文件上传中的表单字段) - 正则模式别硬编码在代码里,改用配置项,例如
@Value("${security.sql-inject.pattern:...}"),方便灰度和开关
避免常见误操作
很多团队上线后才发现过滤器没生效,问题往往出在加载顺序和范围控制上。
-
@WebFilter类必须加@Component,否则 Spring Boot 的嵌入式容器(Tomcat/Jetty)不会扫描到它 - 如果用了 Spring Security,
Filter链顺序很重要:SQL 过滤器应放在SecurityFilterChain之前,否则未认证请求可能绕过 - 别对所有路径都过滤——健康检查(
/actuator/health)、静态资源(/css/,/js/)、Swagger(/v3/api-docs)应excludePathPatterns掉,否则影响监控和调试 - 日志记录要谨慎:不要把原始参数全打到日志里,尤其含密码、token、身份证字段,否则引入新的敏感信息泄露风险
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










