检测非法语法结构的核心是“先定义合法,再反向抓取非法”,通过正则匹配特定场景下禁止的字符组合或结构,如sql注入片段、模板危险表达式、非法键名、路径遍历等。

检测字符串中的非法语法结构,核心是“先定义合法,再反向抓取非法”。正则本身不理解语义,但能精准识别字符组合模式——只要明确哪些结构在当前上下文中不允许出现,就能用正则快速定位。
明确非法结构的边界范围
非法语法结构不是泛指所有特殊符号,而是特定场景下被禁止的组合。比如:
- SQL注入风险结构:如';--、UNION SELECT(忽略大小写)、/* ... */内嵌注释
- 模板引擎危险表达式:如${...}、#if(...)出现在不允许执行逻辑的字段中
- 配置文件非法键名:如含空格、点号、等号的键(user.name、api key)
- 路径遍历片段:../、..、%2e%2e%2f
用否定字符类直接匹配非法字符
最常用也最高效的方式:用[^...]匹配“不在白名单内的字符”。例如:
- 只允许字母、数字、下划线、短横线和点号 → 合法集:[a-zA-Z0-9_.-] → 非法字符正则:[^a-zA-Z0-9_.-]
- 用户名禁用控制字符和Unicode分隔符 → 正则:[u0000-u001Fu200B-u200Fu2028-u202F]
- 文件名禁用Windows保留名+非法字符 → 可组合:[:"/\|?*u0000-u001F]|^.|CON|PRN|AUX|NUL|COM[1-9]|LPT[1-9]$(注意需加(?i)忽略大小写)
用预定义类快速覆盖常见非法类型
Java 中的W(非单词字符)、D(非数字)、S(非空白)可快速定位异常成分:
- \W 匹配@ # $ % ^ & * ( ) + = [ ] { } | ; ' : " , . ? /等——适合粗筛含符号的非法输入
- \D 在纯数字字段(如电话、邮编)中发现字母或汉字,即为非法
- 组合使用更精准:[^\w\s] 表示“非字母数字下划线且非空白”,比单纯\W排除空格更合理
捕获非法结构而非单个字符
真正要拦截的是“结构”,不是孤立字符。这时需用带量词和边界的模式:
- 检测路径遍历:(\.\./|\.\.\\|%(?:2e|2E){2}%(?:2f|2F))
- 检测内联 SQL 注释:--.*$|/\*[^*]*\*+(?:[^/*][^*]*\*+)*/(注意 Java 字符串中需双反斜杠)
- 检测未闭合的引号或括号(简易版):"[^"]*$|'[^']*$', \([^()]*$|\{[^{}]*$
实际使用时建议配合Pattern.compile(regex, Pattern.CASE_INSENSITIVE | Pattern.MULTILINE)提升鲁棒性。











