Discuz 开启验证码后仍然遭遇爆破攻击怎么加强策略

文章导读
开启验证码仅能阻挡低级脚本,遭遇持续爆破需结合 Web 服务器频率限制与防火墙策略。适用所有 Discuz 站点,风险边界是可能误伤正常用户登录。
📋 目录
  1. 快速处理思路
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
A A

开启验证码仅能阻挡低级脚本,遭遇持续爆破需结合 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 自带的安全中心够用吗

仅靠应用层插件不够,必须配合服务器层防火墙才能有效减轻负载。