01 它是干嘛的
WAF 工作在应用层,专门检查每一个 HTTP 请求的内容是否符合「明显的攻击特征」。它不依赖你的代码是否写得安全,而是在请求到达代码之前就拦掉可疑请求,是修漏洞之外的第二道防线。
02 为什么会有它
为什么代码里的一个小漏洞,能让整个数据库被拖走
网站开发者常常犯两类错误:一是把用户输入直接拼进数据库语句(SQL 注入),攻击者输入一段特殊字符就能绕过验证、把整张用户表读走;二是把用户输入直接显示在页面上(XSS),攻击者可以注入一段脚本,盗取其他访客的登录态。
理想情况是修好每一行代码,但现实是系统由几十个团队、几百万行代码构成,还有大量无法改动的历史系统与第三方组件。漏洞公告每天都有,补丁永远追不上。
WAF 的思路是「在门口设安检」:不管屋里的人是否可靠,先检查每个进去的人。它积累了大量已知攻击的特征,也能用机器学习判断哪些请求行为异常(例如一个 IP 每分钟枚举上千个用户名)。Cloudflare 的优势在于这些规则在边缘执行,不占用你的服务器资源,并且规则库由全球数百万网站的攻击数据持续更新。
03 它怎么工作
WAF 是分层叠加的:托管规则库(已知攻击)、自定义规则(你的业务逻辑)、速率限制(异常频率)、Bot 评分(自动化程序),任何一个命中都可以选择拦截或挑战。
请求进站前的四道筛子
- 1① 请求到达最近边缘节点
因为流量本来就走 CDN 通道,检查不带来额外网络跳数,几乎不增加延迟。
- 2② 托管规则库匹配
用 OWASP 核心规则集等特征库匹配参数里的 SQL 关键字、脚本标签、路径穿越等常见攻击形态。
- 3③ 自定义规则与限速
按你的业务特征写规则,例如「登录接口单 IP 每分钟超过 10 次就挑战」「后台路径仅允许公司出口 IP」。
- 4④ Bot 评分与挑战
综合浏览器指纹、行为轨迹、IP 信誉给出机器人评分,可疑但不确定的下发 JS 挑战而非直接拒绝,避免误伤。
- 5⑤ 放行、挑战或拦截并留痕
处理结果都写入日志,可在控制台按事件回放请求详情,用于排查误拦与复盘攻击。
04 谁在用它
那些没人敢改的老系统,用 WAF 在外面加一层防护,比动代码安全得多。
登录、短信验证码接口加限速与挑战,把自动化的账号枚举脚本挡在门外。
价格抓取、内容搬运等爬虫通过 Bot 管理识别并限流,把带宽留给真实用户。
突发 0day 漏洞(如某个通用组件的反序列化漏洞)时,先用 WAF 规则顶住,争取修复时间。
05 怎么用
托管规则库可一键开启(低误杀档起步);自定义规则需要了解一点表达式语法。
- 01域名接入并开启代理后,进入 Security → WAF,开启 Managed Rules,选择 OWASP 核心规则集。
- 02先用「仅记录(Log)」模式跑 1-3 天,查看会拦下哪些请求,确认真实业务没被误伤。
- 03确认无误后切换到「拦截(Block)」模式,并保留误拦截的快速放行入口。
- 04用表达式写自定义规则,例如按路径、方法、国家、UA 组合设条件。
- 05对登录、下单、发送验证码等敏感接口单独配置速率限制规则。
- 06开启 Bot Fight Mode 或企业版 Bot Management,对疑似机器人做挑战。
# 只允许公司出口 IP 访问后台管理路径,其余一律拦截
(http.host eq "api.example.com" and starts_with(http.request.uri.path, "/admin/"))
and not ip.src in {203.0.113.0/24 198.51.100.7}
# 登录接口限速:同一 IP 1 分钟内超过 10 次就下发挑战
(http.request.uri.path eq "/api/login" and http.request.method eq "POST")
→ Rate limiting: 10 requests / 1 minute → Managed Challenge避坑提示
- !先记录后拦截,是避免 WAF 把正常用户挡在门外最有效的一条纪律。
- !自定义规则的顺序决定优先级,宽泛的放行规则(Skip)会跳过后续所有检查,慎用。
- !WAF 不能替代代码修复:它是外部过滤,输入校验与参数化查询仍必须做。
06 关键概念
- SQL 注入
- 把恶意 SQL 片段塞进输入框,诱使数据库执行,从而窃取或篡改数据。
- XSS
- 把恶意脚本注入网页,在其他用户浏览器里执行,常用于盗取登录态。
- 托管规则
- 厂商维护的攻击特征库,你只需开关和调等级,不用自己写规则。
- 误杀(False Positive)
- 正常用户的请求被误判为攻击而拦截,是 WAF 配置中最需要防范的问题。