开启验证码仅能阻挡低级脚本,遭遇持续爆破需结合 Web 服务器频率限制与防火墙策略。适用所有 Discuz 站点,风险边界是可能误伤正常用户登录。
先说结论:单纯依赖 Discuz 内置验证码无法防御分布式爆破,必须在 Web 服务器层或网关层实施 IP 频率限制。
- 先判断:确认攻击流量是否穿透 CDN 直达源站 IP
- 优先做:在 Nginx 或 Apache 配置登录接口请求频率限制
- 再验证:观察正常用户登录是否受阻及日志拦截记录
快速处理思路
Discuz 爆破防护需多层级联动,优先在 Web 服务器层拦截高频请求,再辅以应用层策略。
- 检查 Web 服务器日志,定位高频访问 IP 段
- 配置 Nginx limit_req 或 Apache mod_evasive 模块
- 启用 Discuz 安全中心插件增强登录保护
- 修改默认后台路径,减少被扫描概率
为什么会这样
验证码被绕过是因为攻击者使用了识别服务或人工打码平台。Discuz 内置验证码仅在 PHP 层面生效,请求到达 PHP 前已消耗服务器资源。
爆破攻击通常来自分布式僵尸网络,单一 IP 请求频率低但总量大,绕过基于单 IP 的简单限制。应用层验证无法阻止连接建立,需在网络层提前丢弃恶意请求。
分步处理
按服务器环境选择对应配置,操作前备份配置文件。
1. Nginx 层频率限制
在 server 块中添加 limit_req_zone 定义,针对登录接口 apply 限制。
limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m;
location ~* /member.php {
limit_req zone=login burst=10 nodelay;
}检查点:重载配置后观察 error.log 是否有 limit_req 限制记录。
2. 启用 Fail2ban 监控
安装 Fail2ban 并配置 Discuz 日志过滤规则,自动封禁触发多次失败的 IP。
检查点:查看 fail2ban.log 确认 ban 动作是否执行。
3. Discuz 安全插件配置
进入后台“应用”->“安全中心”,开启登录保护及异地登录提醒。
检查点:确认插件状态为运行中,规则已生效。
4. 修改后台入口
修改 config/config_global.php 中的 admincp 目录名称或启用后台入口验证。
检查点:原后台地址无法访问,新地址正常登录。
怎么验证是否生效
通过模拟高频请求和检查日志确认拦截策略是否工作。
- 使用 ab 或 curl 脚本对登录接口发起高频请求,观察是否返回 503 或 403
- 检查 Web 服务器 access.log,确认攻击 IP 请求量下降
- 尝试正常账号登录,确认未被误拦截
- 监控服务器 CPU 和内存负载,确认资源消耗降低
常见坑
- CDN 未透传真实 IP:Web 服务器记录的是 CDN 节点 IP,导致封禁失效,需配置获取 X-Forwarded-For
- 限制过严:频率阈值设置过低会导致正常用户无法登录,需根据实际流量调整
- 仅靠 PHP 限制:攻击流量已消耗带宽和连接数,PHP 层拦截无法节省网络资源
- 忽略 API 接口:除网页登录外,需同时限制 app 接口或 XMLRPC 入口
常见问题
开启频率限制会影响搜索引擎收录吗
合理配置不会影响,搜索引擎爬虫通常遵守 robots 协议且频率较低。
为什么封禁 IP 后攻击仍在继续
攻击者使用了动态 IP 池,需结合验证码难度升级或引入行为验证。
Discuz 自带的安全中心够用吗
仅靠应用层插件不够,必须配合服务器层防火墙才能有效减轻负载。