perf(waf): 收窄安全防护扫描面并优化 UA 热路径

注入类检测仅扫 Query/Cookie/Referer/有限 Body,避免全 Header 匹配拖垮边缘 CPU;
按开关采集输入、GET 跳过 read_body,UA 仅 lower 一次并用 set 匹配白名单。
This commit is contained in:
ryan
2026-07-19 14:16:34 +08:00
parent 39473cb370
commit 46ce7de513
4 changed files with 182 additions and 76 deletions
+1
View File
@@ -31,6 +31,7 @@ sidebar: false
- WAF 规则编辑器支持为节点自定义显示名称,并从节点库拖放到画布指定位置添加节点。
- WAF 规则画布支持右键删除节点或连线,并屏蔽浏览器默认右键菜单。
- WAF 规则编辑器支持一键格式化布局,按流程层次自动整理节点位置。
- 优化边缘 WAF「安全防护」与「UA 检查」热路径:SQL/命令/XSS 等仅扫描 Query、Cookie、Referer 与有限 Body,避免对全部请求头做特征匹配;路径检测不再重复扫描完整 `request_uri`;无请求体时跳过 Body 读取;UA 分类仅小写一次并加速白名单匹配,显著降低开启基础防护时的 CPU 占用。
## [v3.4.0] - 2026-07-19
@@ -52,15 +52,15 @@
| 字段 | 默认 | UI 文案 | 检测面(v1) |
|------|------|---------|--------------|
| `sql_injection` | false | SQL 注入 | Query、Body、Header、Cookie |
| `path_traversal` | **true** | 路径穿越防护 | Path、Query、Body |
| `command_injection` | false | 命令注入 | Query、Body、Header |
| `xss` | false | XSS | Query、Body、Header |
| `ssrf` | false | SSRF | Query、Body 中 URL 形态参数 |
| `file_inclusion` | **true** | 文件包含(LFI/RFI) | Path、Query、Body |
| `sql_injection` | false | SQL 注入 | Query、Cookie、Referer、Body |
| `path_traversal` | **true** | 路径穿越防护 | Path(`uri`)、Query、Body |
| `command_injection` | false | 命令注入 | Query、Cookie、Referer、Body |
| `xss` | false | XSS | Query、Cookie、Referer、Body |
| `ssrf` | false | SSRF | Query、Cookie、Referer、Body 中 URL 形态 |
| `file_inclusion` | **true** | 文件包含(LFI/RFI) | Path(`uri`)、Query、Body |
| `malicious_upload` | false | 恶意文件上传 | Multipart Body |
| `xxe` | false | XXE | Body(Content-Type 含 xml 时) |
| `crlf_injection` | false | CRLF 注入 | Header、Query、Body |
| `crlf_injection` | false | CRLF 注入 | Query、Cookie、Referer、Body |
全部关闭时:节点恒 **true**(空操作),合法。
@@ -80,11 +80,11 @@ return true
| 来源 | 方式 |
|------|------|
| Path | `ngx.var.uri`,URL 解码(含常见双重编码路径变体) |
| Query | `ngx.var.args` / `get_uri_args` 键与值 |
| Header | 请求头名+值(可排除 `Host` 等噪声,实现时固定白名单或全量) |
| Cookie | `Cookie` 头或 cookie 表 |
| Body | 仅当某已启用规则需要 Body,且 `Content-Length` 存在且 ≤ **65536**;否则跳过 Body 相关规则 |
| Path | 仅 `ngx.var.uri`(不重复扫完整 `request_uri`,避免与 Query 双计),URL 解码(含常见双重编码路径变体) |
| Query | `get_uri_args` 键与值(仅当已启用规则需要 Query) |
| Header | **不**扫描通用浏览器头(UA / Accept 等);注入类仅采 **Cookie、Referer** |
| Cookie | `ngx.var.http_cookie` |
| Body | 仅当已启用规则需要 Body 且 `Content-Length` > 0 且 ≤ **65536**;GET/零长度不 `read_body` |
Body 读取失败:跳过 Body 类检测并限频 warn(可用性优先,不 fail-closed 整图)。