当前位置: 首页 > 图灵资讯 > 行业资讯> 如何修复Python Django项目中因暴力破解攻击导致的账户安全风险?

如何修复Python Django项目中因暴力破解攻击导致的账户安全风险?

来源:图灵python
时间: 2026-07-29 17:11:34
django-axes是最直接可控的暴力破解防护方案,需要正确配置axes_FAILURE_LIMIT=5、AXES_LOCK_OUT_AT_FAILURE=True和AXES_COOLOFF_TIME=600,并确保Axesmidleware在Sessionmidleware之后,Authenticationmidleware之前,Axesbackend在Authentication_BACKENDS中排名第一。

django-axes 这是目前最直接、最可控的修复方案。它不依赖于你重写登录逻辑,也不要求你手动记录 IP 或者禁止状态——只要正确接入,就可以在 5 暴力破解者在几分钟内反复撞墙。

为什么 AXES_FAILURE_LIMIT 设成 5 还被绕过? 常见的错误是只改变限制次数,但不匹配 AXES_LOCK_OUT_AT_FAILUREAXES_COOLOFF_TIMEAXES_FAILURE_LIMIT = 5 只说“失败” 5 第二次触发锁定,但是否真的锁定,锁多久,取决于另外两个开关: - AXES_LOCK_OUT_AT_FAILURE = True(默认 False,不设就等于不锁。 - AXES_COOLOFF_TIME = 600(单位秒,即 10 分钟;设为 None 永久锁定) - 如果用的是 IP 还要注意等级锁定(默认):Nginx 或 CDN 之后的真实客户端 IP 可能被覆盖,需要同步配置 AXES_IPWARE_PROXY_COUNTAXES_IPWARE_PROXY_HEADERS axes.middleware.AxesMiddleware 添加在哪里生效? 必须加在 SessionMiddleware 之后、AuthenticationMiddleware 以前。顺序错误会导致: - 未登录时,用户无法识别会话,axes 拿不到 session_key,误判为新请求 - 中间件加载顺序颠倒后,AXES_RESET_ON_SUCCESS = True 无效,成功登录不清楚计数 标准顺序示例:
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'axes.middleware.AxesMiddleware',  # ← 必须在这儿
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
]
返回登录接口 403 却没进 axes 日志? 这通常意味着请求根本没有到达 AxesBackend。检查三件事: - AUTHENTICATION_BACKENDS 是否把 axes.backends.AxesBackend 放在第一位?必须优先考虑吗? ModelBackend,否则,失败将由后者直接处理,axes 完全无感知 - 是否使用了登录视图 login() 函数?假如是手写的 authenticate() + login() 流程,但遗漏 request 参数传给 authenticate()axes 不能得到上下文 - 是否启用了 AXES_ONLY_USER_FAILURES = True?该选项会让 axes 只计算已知用户名的失败(例如,如果攻击者盲目猜测用户名,则不计入)-虽然这可以减少意外伤害,但也会削弱保护力度 生产环境里 axes 如果记录飙升,数据库变慢怎么办?axes 默认情况下,所有的尝试都存储在数据库中,在高频攻击下很容易被拖垮 PostgreSQL 或 MySQL。 可行解法: - 把 AXES_HANDLER = 'axes.handlers.cache.AxesCacheHandler',改用 Redis 缓存存储计(需要提前安装) django-redis 并配置 CACHES) - 设置 AXES_META_TRUNCATE_LENGTH = 255,避免长 User-Agent 或 Referer 写满字段 - 定期清理:python manage.py axes_reset 或按需调用 axes.reset 不要等表膨胀到信号 GB 级再动手

真正容易被忽视的是:axes 默认锁定粒度 IP,但是大多数现代应用程序都在运行 Nginx + uWSGI 所有的请求似乎都来自 127.0.0.1.不配透传真实 IP,等于锁了一个孤独。

Python Django环境建设网站开发 WORD版

本文主要讲述Python Django环境建设网站开发;希望本文档能对有需要的朋友有所帮助;有兴趣的朋友可以来看看

下载