Python如何防止暴力破解_账户连续输错锁定策略与登录频次限制

张开发
2026/5/30 10:28:39 15 分钟阅读
Python如何防止暴力破解_账户连续输错锁定策略与登录频次限制
最稳组合是Flask-LoginRedis用login_fail:{username}为keyincr()计数并expire(300)设5分钟过期超5次即拒验密码防时序攻击Django-axes需迁移表、配IP用户双锁、反代时修正IP获取顺序禁用lru_cache因不跨进程且无过期前端禁用按钮仅为体验优化非安全措施。用 flask-login redis 实现登录失败计数与临时锁定直接上手最稳的组合每次输错密码就往 redis 里存一个带过期时间的失败记录。不依赖数据库锁表或复杂状态机轻量且抗并发。常见错误现象KeyError 或计数不生效多半是没统一 key 格式比如混用 user_id 和 username或者忘了设 ex3005 分钟过期导致用户永远被锁。key 必须唯一且可预测推荐格式flogin_fail:{username}用 redis.incr() 增加计数再立刻 redis.expire(..., 300)避免多次调用间断开连接导致过期失效检查是否超限用 redis.get() 拿当前值注意返回的是 bytes得 int(redis.get(...) or b0)一旦达到阈值如 5 次直接拒绝验证逻辑不调用 check_password_hash——省 CPU也防侧信道时序攻击django.contrib.auth 自带的 django-axes 怎么配才不踩坑django-axes 看着省事但默认配置在生产环境容易失灵比如没开 AXES_LOCK_OUT_BY_COMBINATION_USER_AND_IP结果同一 IP 下不同用户互相误锁或者日志表没迁移axes_accessattempt 表不存在整个插件静默失效。必须运行 python manage.py migrate axes否则所有记录都丢进空里锁定策略要显式选一种AXES_LOCK_OUT_AT_FAILURES 5 AXES_COOLOFF_TIME 30/60单位是分钟如果用了 Nginx 反向代理务必配 AXES_META_PRECEDENCE_ORDER [HTTP_X_FORWARDED_FOR, REMOTE_ADDR]否则拿到的全是 127.0.0.1别开 AXES_RESET_ON_SUCCESS True它只清成功登录前的记录输错 4 次后登对了第 5 次错照样锁——逻辑反直觉纯内存方案functools.lru_cache为什么不适合做频次限制有人图快想用 lru_cache(maxsize1000) 缓存用户名失败次数但这是危险操作进程重启就清零多 gunicorn worker 之间不共享状态缓存键若含时间戳还会让命中率归零。 稿定AI 拥有线稿上色优化、图片重绘、人物姿势检测、涂鸦完善等功能

更多文章