凌晨两点,客户的电话打了过来:“网站打不开了,后台全是陌生的管理员账号。”我登上服务器一看,日志里密密麻麻全是对 xmlrpc.php 和 wp-login.php 的暴力请求,一小时之内超过八万次。
这种场景,我们每个月至少遇到三四回。奇怪的是,出事的站点里,超过一半其实“装了防火墙”。问题出在哪?出在装了不等于配了。
这篇文章不讲空话,只讲 WAF(Web 应用防火墙)在 WordPress 站点上到底该怎么配,哪些坑我们替你踩过了。
先搞清楚:你以为的 WAF,可能根本不是 WAF
很多站长把“安全插件”和“WAF”画等号。这是第一个误区。
安全插件(比如 Wordfence、iThemes Security)大多运行在 PHP 层。请求已经穿过 Nginx、进入 WordPress 之后,插件才开始检查。换句话说,恶意流量已经消耗了你的服务器资源,插件只是在“事后拦截”。
真正意义上的 WAF 分三个层级:
| 层级 | 典型方案 | 拦截位置 | 优点 | 短板 |
|---|---|---|---|---|
| 云端 WAF | Cloudflare、阿里云 WAF、Sucuri | 流量到达服务器之前 | 抗 CC/DDoS,不占服务器资源 | 规则细粒度受限于套餐 |
| 服务器层 WAF | ModSecurity、Nginx + Naxsi、雷池 SafeLine | Web 服务器内部 | 规则可深度定制,响应快 | 需要运维能力 |
| 应用层 WAF | Wordfence、NinjaFirewall | PHP 执行阶段 | 理解 WordPress 语境,部署简单 | 吃 PHP 资源,挡不住大流量 |
专家点评:靠单一一层扛所有攻击,基本是自欺欺人。我们给客户的标准方案是“云端 + 应用层”双层,预算和技术都够的话再加服务器层。
2026年,攻击者的玩法变了
别再拿五年前的威胁模型看问题了。目前我们在客户站点日志里看到的主流攻击,大致有这几类:
- 插件漏洞自动化利用:漏洞披露后 24 小时内就有批量扫描脚本上线。WordPress 生态里,超过九成的漏洞来自插件和主题,而不是核心。
- 低频慢速爆破:不再是一秒几十次猛攻,而是每个 IP 每小时只试两三次,靠大量代理 IP 轮换,绕过传统的“失败 N 次封 IP”规则。
- REST API 滥用:通过
/wp-json/wp/v2/users枚举用户名,再针对性爆破。 - AI 驱动的爬虫与注入探测:请求特征越来越像真人,UA、Referer、访问节奏都伪装得很好。
这意味着什么?意味着靠 IP 黑名单、靠关键词匹配的老办法,拦截率会越来越低。规则要围绕“行为”和“路径”来设计。
第一步:云端 WAF 怎么配才不会误伤自己
以 Cloudflare 为例(国内客户用阿里云、腾讯云 WAF 的逻辑类似)。很多人开了橙色小云朵就以为万事大吉,其实默认配置只能挡住最粗糙的流量。
必配的五条自定义规则
1. 保护登录入口
对 /wp-login.php 和 /wp-admin/ 设置质询(Managed Challenge),但要放行 /wp-admin/admin-ajax.php,否则前台很多依赖 AJAX 的功能(购物车、表单、搜索)会直接挂掉。
(http.request.uri.path contains "/wp-login.php") or
(http.request.uri.path contains "/wp-admin" and not http.request.uri.path contains "admin-ajax.php")
动作:Managed Challenge 专家点评:这里漏掉 admin-ajax 例外,是我们接手别人站点时最常见的低级事故。WooCommerce 店铺一旦拦了它,加购按钮直接失灵,老板还以为是主题出了 bug。
2. 直接封死 xmlrpc.php
除非你确实在用 Jetpack 或者手机端远程发布,否则这个文件没有存在的必要。它既能被用来放大爆破(一次请求尝试多组密码),也是 DDoS 反射的常客。
(http.request.uri.path eq "/xmlrpc.php")
动作:Block 3. 限制 REST API 用户枚举
(http.request.uri.path contains "/wp-json/wp/v2/users" and not http.cookie contains "wordpress_logged_in")
动作:Block 4. 拦截敏感文件探测
扫描器最爱探的路径:.env、.git、wp-config.php.bak、backup.zip、phpinfo.php。
(http.request.uri.path matches "(.env|.git|.sql|.bak|.zip|phpinfo)$")
动作:Block 5. 针对上传目录禁止执行 PHP
这条严格来说属于服务器层,但云端也能做个补充:对 /wp-content/uploads/ 下以 .php 结尾的请求直接拦截。一旦攻击者通过某个上传漏洞丢了 webshell,这是最后一道闸。
速率限制:别设成“一刀切”
登录接口建议:同一 IP 10 分钟内超过 5 次请求触发质询。搜索接口 /?s= 建议单独限速——它是 CC 攻击的重灾区,因为每次搜索都会打到数据库。
第二步:服务器层,才是你真正的主场
云端 WAF 有个天然盲区:如果攻击者摸到了你的源站真实 IP,直接绕过 CDN 打过来,前面配得再漂亮也白搭。
所以第一件事:让源站只接受 CDN 的回源请求。以 Nginx 为例,配合 Cloudflare 官方 IP 段做 allow/deny,其余一律拒绝。
location / {
allow 173.245.48.0/20;
allow 103.21.244.0/22;
# ……其余 Cloudflare 段,定期同步官方列表
deny all;
} 专家点评:IP 段会变,别手写死。我们的做法是用脚本每周拉取官方列表,自动生成配置并平滑重载 Nginx。
ModSecurity + OWASP CRS 的正确打开方式
很多人装了 ModSecurity 又立刻卸掉,理由是“误报太多,后台都进不去”。这不怪工具,怪你直接上了高偏执级别(Paranoia Level)。
正确节奏是:
- 先用
DetectionOnly模式跑一到两周,只记录不拦截; - 从审计日志里筛出误报规则 ID,针对 WordPress 写排除规则;
- 确认稳定后切
On模式,Paranoia Level 保持在 1,必要时对登录等关键路径单独提升到 2。
WordPress 场景里最常见的误报来自 Gutenberg 编辑器(提交的 JSON 里含大量 HTML 片段,会触发 XSS 规则)。给 /wp-admin/post.php 和 /wp-json/wp/v2/ 的已登录请求加排除规则,问题就解决了。
SecRule REQUEST_URI "@beginsWith /wp-json/wp/v2/"
"id:1000010,phase:1,pass,nolog,
ctl:ruleRemoveTargetById=941100-941190;ARGS:content" 专家点评:只放行内容字段的 XSS 检测,而不是整条路径关闭规则。粒度越细,安全性损失越小。
实战案例一:一次“防火墙开着却被攻破”的复盘
去年我们接手一家外贸企业站,他们用的是 WooCommerce,装了某知名安全插件,Cloudflare 也开着。结果还是被挂了博彩链接。
排查下来,问题链条是这样的:
- 站点用了一个三年未更新的“产品询盘表单”插件,存在任意文件上传漏洞;
- 攻击者上传了伪装成
.jpg.php的 webshell; - 安全插件的文件扫描设置为“每天一次”,而 Cloudflare 免费版对上传的文件内容毫无感知;
- Nginx 没有禁止 uploads 目录执行 PHP,shell 直接跑了起来。
补救措施我们做了四件事:禁止 uploads 目录执行 PHP、替换漏洞插件、在 WAF 增加对双扩展名文件的拦截规则、把文件完整性监控改为实时。
教训:WAF 是纵深防御的一环,不是护身符。插件更新和最小权限,永远比任何规则都重要。
实战案例二:误拦截让订单掉了 30%
另一家 WooCommerce 店铺,老板自己开了 Cloudflare 的“高安全级别”加“Bot Fight Mode”,三天后发现订单暴跌。
原因很讽刺:支付网关的异步回调(Webhook)来自境外服务器,被当成机器人质询了。支付成功,但订单状态永远停在“待付款”,客服被投诉到崩溃。
解决方法是给 /wc-api/ 和各支付插件的回调路径建立例外规则,并按支付服务商公布的 IP 段做白名单。
专家点评:任何 WAF 规则上线后,必须走一遍完整业务链路:注册、登录、下单、支付回调、邮件通知、表单提交。少测一环,就是埋雷。
那些年,大家都在重复的误区
- 误区一:安全级别越高越好。高安全级别意味着更多质询、更高误杀。真实用户体验下降,转化率跟着掉。
- 误区二:国家封锁一劳永逸。粗暴封掉某些国家,看似清净,却会误伤使用代理的正常访客,还可能影响搜索引擎爬虫。建议对登录路径做地区限制,而不是全站封。
- 误区三:只配规则,不看日志。WAF 日志是情报金矿。每周花半小时看一遍被拦截最多的路径和规则,你会清晰知道自己站点正在被什么盯上。
- 误区四:多个安全插件叠加。两个 WAF 插件同时跑,互相冲突、重复拦截、性能暴跌。一个应用层方案就够了。
一份可直接照抄的上线检查清单
- 云端 WAF 已启用,源站 IP 已隐藏,且服务器仅允许 CDN 回源;
- xmlrpc.php 已封禁(或已评估必要性);
- 登录路径启用质询 + 速率限制,admin-ajax.php 已放行;
- REST API 用户枚举已封堵;
- uploads 目录禁止执行 PHP;
- wp-config.php 权限设为 400 或 440,并禁用后台文件编辑(
define('DISALLOW_FILE_EDIT', true);); - 支付、物流、第三方回调路径已做白名单测试;
- WAF 日志每周复查,规则每季度回顾;
- 插件与主题更新机制已建立,并有预发布环境验证。
写在最后:规则可以抄,经验抄不来
WAF 配置最难的部分,从来不是语法,而是判断:这条规则会不会误伤业务?这个路径到底能不能放行?攻击流量和高峰期的正常流量,怎么区分?
这些判断,只能靠一次次线上事故和复盘积累出来。我们在云策WordPress建站做了这么多年企业站、WooCommerce 店铺和定制开发,几乎把上面每一个坑都踩过一遍——所以我们交付的站点,从开发阶段就把安全架构考虑进去:代码层面避免常见漏洞,部署层面做好分层防护,上线后持续监控与规则调优。
如果你的站点正被异常流量困扰,或者正准备上线一个对安全要求较高的 WordPress / WooCommerce 项目,不妨先让我们做一次免费的安全体检。把风险摸清楚,比出了事再救火,省钱得多。