Skip to content

如意面板 WAF 防护原理

一句话概括

WAF 就像一个门卫,检查每一个进入网站的请求,发现可疑的就拦住它。


工作流程

每个 HTTP 请求到达 Nginx 时,WAF 按以下顺序依次检查:

请求进入

  ├─ 1. IP 白名单 → 命中则直接放行,跳过所有检查

  ├─ 2. URL 黑白名单 → 命中黑名单则拦截;命中白名单则跳过后续检查

  ├─ 3. IP 黑名单 → 命中则拦截

  ├─ 4. UA 黑名单 → 命中则拦截(User-Agent 检查)

  ├─ 5. 请求限制 → HTTP 方法、请求体大小等

  ├─ 6. 地域封禁 → 按 IP 所在国家/地区拦截

  ├─ 7. CC 防护 → 频率限制、错误计数、攻击容忍度

  ├─ 8. 攻击规则检测 → SQL注入、XSS、命令注入等(异常评分模式)

  └─ 全部通过 → 放行

关键点:白名单优先级最高,命中即放行;任何一个环节命中黑名单/规则即拦截。


两种工作模式

模式行为适用场景
观察模式只记录日志,不拦截初次部署,先观察是否有误报
防护模式记录日志 + 拦截请求(返回403)正式防护

每个网站可以独立设置模式。


攻击检测:异常评分机制

传统 WAF 的问题是:单条规则匹配就拦截,容易误报。如意面板采用异常评分机制(参考 OWASP CRS),更智能地判断攻击。

评分规则

每条规则有一个严重度分数:

严重度分值说明
critical5命中即拦截(单条就超阈值)
high4命中即拦截
medium3需要多条规则叠加
low1需要多条规则叠加

不同检查位置有不同的权重:

位置权重说明
URL 参数1.0最可信,权重最高
POST Body1.0最可信,权重最高
Cookie0.8较可信
Header0.5容易误报,权重最低

计算公式

单条规则得分 = 严重度分值 × 位置权重
累计得分 = 所有命中规则得分之和
是否拦截 = 累计得分 >= 阈值(5)

举例

场景:用户提交了一个包含 SQL 注入的表单
  - POST body 匹配 SQL注入规则(high=4) × 权重(1.0) = 4.0
  - Header 中匹配了可疑关键词(low=1) × 权重(0.5) = 0.5
  - 累计 = 4.5 < 5 → 不拦截(观察记录)

场景:用户提交了一个包含命令注入的请求
  - POST body 匹配命令注入规则(critical=5) × 权重(1.0) = 5.0
  - 累计 = 5.0 >= 5 → 立即拦截

这种机制的好处:单独一条 low/medium 规则不会误拦,但多条规则叠加时能识别复杂攻击。


攻击规则分类

类别说明示例
SQL 注入检测 SQL 语句注入UNION SELECTOR 1=1
XSS检测跨站脚本攻击<script>alert(1)</script>
命令注入检测系统命令执行;cat /etc/passwd
路径遍历检测目录穿越攻击../../etc/passwd
扫描器检测漏洞扫描工具特征 UA、扫描路径
恶意爬虫检测恶意爬虫爬虫 UA 特征
敏感文件检测敏感文件访问.env.git/config

CC 防护

CC(Challenge Collapsar)防护用于抵御高频请求攻击,包含三个子模块:

1. 频率限制

规则:N 秒内同一 IP 请求超过 M 次 → 触发
示例:60 秒内请求超过 120 次

2. 错误计数

规则:N 秒内同一 IP 触发 WAF 拦截超过 M 次 → 自动拉黑
示例:60 秒内被拦截 10 次 → 该 IP 进入黑名单

3. 攻击容忍度

规则:N 秒内同一 IP 的攻击评分累计超过阈值 → 自动拉黑
用于识别低频但持续的攻击行为

被 CC 拉黑的 IP 会进入临时黑名单,倒计时结束后自动解除。


黑白名单体系

IP 黑白名单

  • 白名单:信任的 IP,跳过所有 WAF 检查(最高优先级)
  • 黑名单:已知恶意 IP,直接拦截
  • 支持手动添加 + CC 自动拉黑
  • 支持临时封禁(带倒计时)和永久封禁

URL 黑白名单

  • 白名单:不需要 WAF 检查的 URL(如 API 回调地址)
  • 黑名单:禁止访问的 URL

UA 黑白名单

  • 白名单:信任的 User-Agent(如搜索引擎爬虫)
  • 黑名单:已知恶意 User-Agent

地域封禁

根据 IP 的地理位置(GeoIP),按国家/地区进行拦截或放行。


JSON 请求智能处理

对于 JSON 格式的 POST 请求(如 API 接口),WAF 会:

  1. 解析 JSON 结构,提取键值对进行检测
  2. 自动跳过长文本字段(>512字符),避免对正常内容误报
  3. 使用独立的置信度评分(阈值3),比普通检测更保守

这使得 WAF 能正确处理 AI 接口、文件上传 API 等包含大量文本的请求。


日志记录

每次触发 WAF 规则都会记录攻击日志,包含:

  • 攻击时间、来源 IP、IP 归属地
  • 攻击类型、严重度、匹配的规则
  • 完整的 HTTP 请求(请求行 + Headers + Body)
  • 采取的动作(拦截/观察)
  • 关联的网站

日志支持按时间范围、攻击类型、严重度、IP 等条件筛选和导出。

Released under the 如意开源许可协议.