完整课程入口:996 全套课程体系 | Lua 学习路径 | 幂尔框架 mirs.cn
登录接口是爆破攻击的主入口:脚本批量尝试"常见弱口令 + 已泄露密码库",命中一个账号就是一次资产风险。防爆破不是简单地"错五次锁定",过严会误伤真实玩家,过松形同虚设。三层设计(延迟、锁定、验证码)兼顾安全与体验。
每次失败后,该账号的下一次尝试延迟翻倍:第 1 次失败后等 1 秒、第 2 次 2 秒、第 4 次 16 秒、第 8 次起固定 5 分钟。延迟在服务器端执行(返回前 sleep 或延迟响应),攻击者的爆破速率被压到不可用。延迟实现用非阻塞定时器,不能在处理线程里直接 sleep(会拖住整个服务)。
local fail = failTable[account] or { n = 0, t = os.time() }
if fail.n >= 10 and os.time() - fail.t < 900 then
return reject("尝试过于频繁,请15分钟后再试")
end
-- 校验密码失败:
fail.n = fail.n + 1
fail.t = os.time()
双维设计防两种变体:只按账号锁定会被攻击者分散目标(撞库多个账号各试 9 次);只按 IP 锁定会被代理池绕过。账号维度 10 次/15 分钟,IP 维度 50 次/15 分钟,两者独立计数。锁定解除用时间自然过期,不设手动解锁(客服解锁流程反而被攻击者社工利用)。
失败满 3 次后,登录界面强制图形验证码(或滑动验证),人机成本大幅上升。验证码校验必须服务端生成与服务端判定,前端的任何验证都可被绕过。
某 996 服上线三层方案后,爆破尝试的成功率归零,正常玩家误触锁定的比例约 0.03%(输错 10 次以上的真实玩家)。监控指标两条:全网失败尝试曲线(突增即有爆破行为)与被锁定账号清单(区分攻击与真实用户求助)。防爆破的参数(次数、窗口)每季度结合监控数据复核一次。