如何配置WAF规则拦截高危SQL注入关键字_设置正则表达式过滤敏感词

浅辰小哥_3326

浅辰小哥_3326

2026-04-25

628人浏览

原创

真正匹配union select需覆盖大小写、空格干扰和注释插入三类绕过,正则应为(?i)union[\s%09%0a%0b%0c%0d\xa0](?:/**/|--+|#)?[\s%09%0a%0b%0c%0d\xa0]select,且必须加\b边界符并启用url/十六进制解码预处理。

如何配置waf规则拦截高危sql注入关键字_设置正则表达式过滤敏感词

怎么写能真正匹配到 union select 这类组合关键字

正则必须覆盖大小写变体、空格干扰、注释插入这三类常见绕过,否则 UnIoN/**/SeLeCt 就能直接穿过去。不能只写 union\s+select,得用 (?i)union\s*(?:/\*\*\/|\s|#|--\s+)?\s*select 这种结构。

常见错误是漏掉中间的零宽断言或可选分隔符,导致只匹配干净请求。实际攻击里空格常被 %09、%a0、/**/ 替代,正则里得显式包含这些可能:

  • \s* 要换成 [\s%09%0a%0b%0c%0d\xa0]* 才覆盖全控制字符
  • 注释符号如 /**/、--+、# 得作为非捕获组加入:(?:/\*\*\/|--\+|#)
  • 避免用 .* 匹配中间内容,性能差还容易误杀;改用 [^&\n\r]{0,50} 限制长度

为什么开了规则却拦不住 ' OR 1=1 -- 这种基础 payload

多数 WAF 默认只扫描 $_GET 和 $_COOKIE,而现代应用大量使用 JSON POST 或表单提交,$_POST 和原始 body(php://input)根本没开扫描。PHPWAF 就需要手动设 $config['scan_post_data'] = true 和 $config['scan_raw_body'] = true。

另一个高频原因是规则加载路径错误。比如配置写了 rule_path = "/etc/phpwaf/rules",但实际文件在 /usr/local/etc/phpwaf/rules/sql_injection.rule,WAF 启动时日志会报 failed to open stream,但很多人不查日志就以为“开了等于生效”。

Mottle
Mottle

Mottle是一款用于为网站创建自定义 AI 聊天机器人的无代码工具。

下载
  • 确认规则文件存在且 PHP 进程有读权限:ls -l /path/to/rules/sql_injection.rule
  • 检查 WAF 日志是否出现 loading rule file 成功提示
  • 用 curl -X POST -H "Content-Type: application/json" --data '{"username":"admin' OR 1=1 --"}' http://test.com/login 实测 POST 场景

哪些 SQL 关键字组合必须进正则,又不能误伤正常业务

只列单个词(如 select)必然误杀,必须抓语义组合。重点盯三类结构:

  • 查询结构:(?i)\b(select|union|insert|update|delete|drop|alter|create|truncate)\b.*?\b(from|into|table|database|where)\b
  • 逻辑运算:(?i)\b(and|or|not)\s+[\w\p{L}]+[=\!]+(防 id=1 and 1=1)
  • 危险函数:(?i)\b(load_file|outfile|dumpfile|sleep|benchmark|version|user|database)\b

注意 \b 边界符必须加,否则 user_id 里的 user 会被误判;[\p{L}\w] 比 \w 更准,能兼容中文变量名场景。

绕过检测的典型变形怎么在规则里提前堵住

MySQL 的内联注释 /*!50001union*/、双写 SELselectECT、十六进制编码 0x756e696f6e 都是高频绕过手段。不能指望一条正则全防住,得拆成多层规则:

  • 先解码再匹配:WAF 层需开启 URL 解码、hex 解码(如 0x[0-9a-fA-F]+ → 转为字符串再走主规则)
  • 对内联注释单独写规则:/\*![0-9]{5,}(union|select|exec)/i
  • 双写检测用负向先行断言:(?i)(u(?=ni))|(n(?=io))|(i(?=on)) 这类模式代价高,慎用;更稳的是匹配连续重复字符后接关键词,如 ([a-z])\1+(union|select)

最易被忽略的是 MySQL 版本注释执行特性——/*!50001select*/ 在任意 MySQL 版本下都会执行,但很多 WAF 规则只当普通注释放过。这条必须单独拎出来加 deny 动作。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

4043

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

851

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1049

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

5921

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

2823

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

5900

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

7861

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1070

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

932

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 20.8万人学习

JavaScript正则表达式基础与实战
JavaScript正则表达式基础与实战

共11课时 | 1.7万人学习

布尔教育正则表达式视频教程
布尔教育正则表达式视频教程

共14课时 | 5.1万人学习