Python如何防止暴力破解_账户连续输错锁定策略与登录频次限制
最稳组合是Flask-Login+Redis:用login_fail:{username}为key,incr()计数并expire(300)设5分钟过期,超5次即拒验密码防时序攻击;Django-axes需迁移表、配IP+用户双锁、反代时修正IP获取顺序;禁用lru_cache因不跨进程且无过期;前端禁用按钮仅为体验优化,非安全措施。用 flask-login + redis 实现登录失败计数与临时锁定直接上手最稳的组合:每次输错密码,就往 redis 里存一个带过期时间的失败记录。不依赖数据库锁表或复杂状态机,轻量且抗并发。常见错误现象:KeyError 或计数不生效,多半是没统一 key 格式,比如混用 user_id 和 username;或者忘了设 ex=300(5 分钟过期),导致用户永远被锁。key 必须唯一且可预测,推荐格式:f"login_fail:{username}"用 redis.incr() 增加计数,再立刻 redis.expire(..., 300),避免多次调用间断开连接导致过期失效检查是否超限用 redis.get() 拿当前值,注意返回的是 bytes,得 int(redis.get(...) or b'0')一旦达到阈值(如 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(maxsize=1000) 缓存用户名+失败次数,但这是危险操作:进程重启就清零;多 gunicorn worker 之间不共享状态;缓存键若含时间戳还会让命中率归零。 稿定AI 拥有线稿上色优化、图片重绘、人物姿势检测、涂鸦完善等功能
更多推荐

所有评论(0)