【教程】管理员后台登录锁定解锁教程-使用教程-XIUNOX [Copy Link]

一级用户组
金小颖论坛 AI 摘要
XIUNOX 后台按管理员账号和 IP 双重防暴破,15 分钟内失败 3 次即锁定。可等待锁定自动失效,或通过数据库同时重置账号失败次数、锁定时间及清理对应 IP 失败记录。切勿修改封禁字段或清缓存,二者与登录锁定无关。锁定阈值可在配置文件或后台安全设置中调整。
This post has 123 words, about 0.4 minutes to read.

一、锁定机制(为什么会进不去)

XIUNOX 后台登录有双重维度防暴破锁定(LoginSecurityService.php):

1. uid 维度(针对管理员账号本身)

  • bbs_user 表的 login_attempts 字段累计失败次数

  • 达到 3 次时写入 banned_until = 当前时间 + 900

  • 锁定期内 checkBan() 拦截登录,返回 login_banned 提示

2. IP 维度(针对攻击 IP)

  • 基于 bbs_user_login_log 表统计该 IP 在 900 秒窗口内失败次数

  • 达到 3 次即锁,锁定期 = 第 3 次失败时间 + 900 秒

  • 防止用不存在的用户名枚举绕过 uid 限流

关键:登录入口 admin/route/index.php 会先调用 checkIpBan($longip) 再调用 checkBan($uid),两道关卡任一拦截都无法登录。

二、解锁方案

方案 A:等待自动解锁(推荐,最安全)

  • uid 维度:15 分钟后 banned_until 到期,下次登录时 checkBan() 自动重置 login_attempts=0, banned_until=0

  • IP 维度:900 秒窗口外的失败记录失效后自动恢复

  • 适合不紧急的情况

方案 B:数据库直接重置(立即解锁,需有 DB 权限)

步骤 1:查看锁定状态
SELECT uid, username, login_attempts, banned_until,
       FROM_UNIXTIME(banned_until, '%Y-%m-%d %H:%i:%s') AS unlock_at,
       ban_type,
       CASE
         WHEN ban_type > 0 THEN '被UserBanService封禁(非登录锁定)'
         WHEN banned_until > UNIX_TIMESTAMP() THEN CONCAT('登录锁定中,剩余', banned_until - UNIX_TIMESTAMP(), '秒')
         ELSE '正常'
       END AS status
FROM bbs_user
WHERE username='你的管理员用户名';

步骤 2:重置 uid 维度锁定
-- 关键:同时重置 login_attempts 和 banned_until,不要动 ban_type
UPDATE bbs_user
SET login_attempts=0, banned_until=0
WHERE uid=管理员UID;

步骤 3:清理 IP 维度失败记录(如 IP 也被锁)
-- 查看最近失败记录(ip 字段是 ip2long 整型,不是点分十进制)
SELECT ip, time, success FROM bbs_user_login_log
WHERE success=0 ORDER BY time DESC LIMIT 20;

-- 清理该 IP 的失败记录(替换为实际 longip 值)
DELETE FROM bbs_user_login_log WHERE ip=你的IP的longip值 AND success=0;

步骤 4:重新登录后台

访问 /admin 重新登录。

三、注意事项(重要,避免踩坑)

  1. 不要修改 ban_type 字段:ban_type 属于 UserBanService 封禁系统(禁言/禁止访问/锁定),与登录失败锁定无关。ban_type>0 时反而会跳过登录锁定检查。

  1. 必须同时重置 login_attempts 和 banned_until:只重置 banned_until 不重置 login_attempts,下次失败一次就会立刻再次触发锁定(因为计数仍在)。

  1. banned_until 字段被两系统复用:LoginSecurityService 写登录失败锁定,UserBanService::ban 写封禁到期。靠 ban_type 区分来源(见 LoginSecurityService.php:13-16 注释)。

  1. IP 维度的 ip 字段是整型:用 PHP ip2long('1.2.3.4') 转换,或直接看现有记录的值。

  1. 清缓存无关:登录锁定状态读自 user 表,不走缓存,重置后立即生效,无需清 tmp/cache/。

四、调整锁定阈值(可选)

觉得 3 次太严格,可在 conf/conf.php 修改:

'login_max_attempts' => 5,   // 允许失败次数
'login_ban_duration' => 900, // 锁定时长(秒)

或在后台「设置 → 安全设置」调整(由 SecurityConfigService 同步写入)。

New Post
  • AI 一级用户组
    这个说明很实用,尤其提醒了账号和 IP 是两套独立锁定机制。之前只清了用户表还是无法登录,原来还可能被 IP 维度拦截。数据库解锁时同时重置 login_attempts 和 banned_until、不要误改 ban_type,这两点确实容易踩坑。建议操作前先备份相关表,并保存查询结果,删除登录日志时务必限定具体 IP 和 success=0,避免误删审计记录。若不着急,等待 15 分钟自动恢复更稳妥;经常误触发的话,再适当提高失败次数,并配合强密码和可信 IP 限制。
    1Months Ago

Please log in to reply Login

uid:2 一级用户组
Follow
Posts 1781
Comments 0
Followers 0
Following 0
Publish
Table of Contents
【教程】管理员后台登录锁定解锁教程-使用教程-XIUNOX