正则匹配关键词无法防御SQL注入,因其仅做字符串扫描而无法识别语法结构、易被大小写混用/注释/编码绕过,且误杀合法业务数据;真正防护须依赖参数化查询与分层设防。

SQL注入过滤器为什么不能只靠正则匹配关键词
直接用 Pattern.compile("(?i)select|insert|update|delete|union|exec|execute|declare)") 这类正则拦截请求参数,看似简单,实则漏洞百出。攻击者用注释绕过(se/**/lect)、大小写混用(SeLeCt)、URL编码(%73%65%6c%65%63%74)或宽字节(%df%27)就能轻松 bypass。更关键的是,合法业务字段名、JSON 字段值、日志内容里也可能含 select,误杀率高。
- 正则只适合做初步筛查,不能作为唯一防御手段
- 过滤器必须在参数绑定前生效,否则
HttpServletRequest.getParameterMap()已被污染 - 优先考虑将校验逻辑下沉到 MyBatis 的
TypeHandler或 JPA 的@Convert,而非在 Filter 层硬塞字符串处理
Filter 中如何安全获取并校验原始请求参数
Java Servlet 的 getParameter() 系列方法会自动解码且不可逆,导致你拿到的已经是“加工后”的值。要真正做注入检测,必须从原始字节流入手:
- GET 请求:重写
getQueryString(),用request.getInputStream()读取原始 query string(注意 GET 的 body 为空,但 query string 在 URL 中) - POST 请求(
application/x-www-form-urlencoded):需在 Filter 中调用request.getReader()或getInputStream()一次,并用HttpServletRequestWrapper缓存内容供后续使用 - 对 JSON 请求体(
application/json),不要解析成 Map 后再遍历——用 Jackson 的JsonParser流式读取,逐个检查FIELD_NAME和VALUE_STRING事件中的字符串值
示例关键点:if (eventType == JsonToken.VALUE_STRING && isSuspicious(value)) { throw new IllegalArgumentException("SQLi detected in JSON value"); }
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
哪些参数类型根本不需要走 SQL 注入过滤
不是所有字符串都可能进 SQL。盲目过滤反而引入性能开销和误判风险:
-
Content-Type、User-Agent、Referer等 Header 值,除非你把它拼进 SQL(那本身就是严重设计错误) - 主键 ID 类型参数(如
id=123)若已定义为Long或数字型 DTO 字段,无需字符串级检测 - 枚举类字段(如
status=ACTIVE)应通过Enum.valueOf()校验,而非查关键词 - 文件上传的
filename值若仅用于存储路径,应走白名单后缀校验(.jpg、.pdf),而非防 SQL 注入
真正有效的全局防护组合策略
单靠一个 Filter 做“全局参数校验”是幻觉。生产环境必须分层设防:
- 最外层:WAF(如 ModSecurity 规则)拦截高频 payload,不依赖 Java 应用自身逻辑
- 中间层:MyBatis 使用
#{}占位符(非${}),JPA 使用@Param+TypedQuery,杜绝字符串拼接 - 内层:数据库账号权限最小化(禁用
FILE、LOAD DATA权限),开启sql_mode=STRICT_TRANS_TABLES - Filter 层仅保留轻量级兜底:对明确标记为“可能进动态 SQL”的参数(如搜索关键词
q、排序字段sort)做白名单校验(如sort只允许name、created_at)
最常被忽略的一点:日志打印时把用户输入原样写入,等于把注入 payload 存进 ELK——哪怕 SQL 没执行成功,日志本身就成了二次攻击入口。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










