httpservletrequest 是只读的,直接修改参数会抛 unsupportedoperationexception;应使用 httpservletrequestwrapper 重写 getparameter 等方法进行清洗,并注意覆盖 get、post、json 请求体,结合参数名上下文过滤、词边界正则、大小写不敏感匹配,且 filter 仅防显式拼接 sql,orm 风险需靠预编译和静态扫描兜底。

Filter中直接修改request参数不生效?
因为 HttpServletRequest 是只读的,调用 setParameter 或类似方法会抛 java.lang.UnsupportedOperationException。你不能靠“改掉 request 里的参数”来过滤 SQL 关键字——这是初学者最常踩的坑。
真正可行的方式是:用包装类(HttpServletRequestWrapper)重写 getParameter、getParameterValues、getParameterMap 等方法,在返回前做清洗。Spring Boot 项目里尤其要注意这点,否则拦截逻辑看似执行了,但后端 Controller 拿到的仍是原始脏数据。
示例关键点:
- 继承
HttpServletRequestWrapper,重写所有可能读取参数的方法 - 清洗逻辑必须覆盖
GET查询字符串、POST表单体、JSON请求体(后者需额外解析) - 不要只过滤
getParameter("xxx"),漏掉getParameterMap()就等于没拦住
SQL关键字列表怎么选才不过度拦截?
硬编码一个黑名单(比如 "SELECT|INSERT|UPDATE|DELETE|UNION|EXEC|EXECUTE|DECLARE|CAST|CONVERT")容易误杀正常业务字段名或用户昵称(如 “select” 作为用户名、“union” 作为品牌名)。更稳妥的做法是结合上下文判断,但 Filter 层做不到深度语义分析,所以得折中:
- 只对明确用于拼接 SQL 的参数名做严格过滤(如
sql、query、condition),其他字段走宽松规则 - 用正则时加词边界
\b(SELECT|INSERT)\b,避免匹配子串 - 区分大小写处理:用
(?i)而不是手动转小写,否则可能破坏原始编码(如 UTF-8 中某些多字节字符转小写出错) - 避开 JSON 字段值:如果请求是
application/json,先用BufferedReader读取原始 body,再解析并清洗 value,而不是依赖getParameter
Spring Boot里Filter注册方式影响拦截范围
@WebFilter 注解在 Spring Boot 中默认不生效,除非启动类加了 @ServletComponentScan。但即便加了,它也只对 Servlet 容器原生路径有效(如 /api/*),对 Spring MVC 的 @RestController 接口可能漏掉——因为请求实际被 DispatcherServlet 处理,而 Filter 在其之前,但若配置不当(比如 urlPatterns = "/*"),又可能把静态资源、Actuator 端点全拦住。
- 推荐用
@Bean方式注册 Filter,显式指定FilterRegistrationBean的urlPatterns - 排除健康检查路径:
"/actuator/**"、"/swagger-ui/**"等必须放行,否则监控失效 - 若项目用了网关(如 Spring Cloud Gateway),Filter 应该放在网关层,而非每个微服务里重复实现
过滤后要不要记录日志或阻断请求?
单纯替换关键字(如把 SELECT 替成空)只是掩耳盗铃。攻击者可绕过:大小写混写(sElEcT)、添加注释(SE/*test*/LECT)、URL 编码(%53%45%4c%45%43%54)。所以真实生产环境必须:
- 对命中规则的请求记录完整原始参数、IP、时间戳、User-Agent
- 返回
HTTP 400或403,且响应体为空或统一错误页,不暴露技术细节 - 触发限流:同一 IP 短时间内多次触发 SQL 关键字,直接加入临时黑名单(用内存 Map + 过期时间,或 Redis)
- 注意性能:正则匹配开销不小,避免对每个请求都全量扫描整个请求体;优先检查参数名是否在高危白名单内,再做内容检测
最易被忽略的是:Filter 只能防“显式拼接 SQL”的场景,对 ORM 框架(如 MyBatis 的 ${}、JPA 的原生查询)无效。这类风险必须靠代码规范 + 静态扫描工具(如 SonarQube)+ 预编译(PreparedStatement)兜底,Filter 只是第一道轻量防线。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











