redis限流最有效方式是用incr+expire实现用户级失败次数统计:以用户名为key,首次失败设900秒过期,超5次拒绝登录,成功后del清空;需配合日志监控与前端防护。

用 Redis 记录失败次数 + 时间窗口
最常用也最有效的方式是结合 Redis 统计用户(或 IP)在固定时间内的登录失败次数。比如:15 分钟内最多允许 5 次失败,超限则拒绝后续请求。
关键点:
- 以 用户名(推荐)或 IP+用户名组合 为 key,避免单 IP 封禁影响正常用户
- 使用 Redis 的
INCR和EXPIRE原子操作,防止并发写入错乱 - 首次失败时设置过期时间(如 900 秒),后续失败只递增不重设
示例逻辑(伪代码):
$lockKey = 'login_fail:' . $username;
$failCount = $redis->incr($lockKey);
if ($failCount == 1) {
$redis->expire($lockKey, 900); // 首次失败才设过期
}
if ($failCount > 5) {
throw new Exception('登录失败次数过多,请稍后再试');
}
验证通过后清空失败记录
用户输入正确凭据成功登录,必须立即删除对应 key,否则会误判后续正常登录。
建议在认证成功、生成 session 后执行:
$redis->del('login_fail:' . $username);
注意不要漏掉这步——很多简单实现就栽在这里。
配合前端做基础防护(非强制但实用)
服务端限流是核心,前端可辅助提升体验和增加攻击成本:
- 登录按钮点击后禁用几秒,防快速连点
- 失败后显示倒计时“还可尝试 X 次”,不暴露具体机制但引导用户停手
- 敏感操作(如密码重置)额外加图形验证码,但登录页不建议默认开启,影响体验
补充建议:日志与监控不能少
光拦截不够,得知道谁在扫、扫什么:
- 记录所有失败登录的用户名、IP、时间、User-Agent
- 对短时间高频失败的 IP 或用户名触发告警(如 1 分钟内 10 次)
- 定期导出分析,识别撞库特征(如大量相同密码、不同用户名)
这些数据还能帮你判断是否要临时升级策略,比如某 IP 突然扫 200 个账号,直接加入黑名单表。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











