fix(captcha): 验证码存储容量上限防 OOM (P1-1)

新增 MAX_STORE_SIZE(默认 10000,可配置 max_store/CAPTCHA_MAX_STORE),
_handle_image 在清理过期项后检查容量,超限拒绝生成并返回错误,
防止攻击者高频生成验证码填满内存。
This commit is contained in:
qing committed 2026-08-04 18:40:36 +08:00
1 parent 4d9bb5d940
commit fe618be1fa
2 files changed
+27 -8

No files matched your search

@@ -16,15 +16,15 @@
| 等级 | 总数 | 已修复 | 部分修复 | 未修复 | 修复率 |
|------|------|--------|----------|--------|--------|
| P0 | 0 | 0 | 0 | 0 | - |
| P1 | 1 | 0 | 0 | 1 | 0% |
| P1 | 1 | 1 | 0 | 0 | 100% |
| P2 | 1 | 0 | 0 | 1 | 0% |
| **合计** | **2** | **0** | **0** | **2** | **0%** |
| **合计** | **2** | **1** | **0** | **1** | **50%** |
### 逐条验证
| 编号 | 状态 | 代码位置 | 验证说明 |
|------|------|----------|----------|
| P1-1 | ❌ 未修复 | `captcha_service.py` L128-129, L204-222 | `captcha_store` dict 无容量上限,`_handle_image` 无生成速率限制,大量请求可耗尽内存 |
| P1-1 | ✅ 已修复 | `captcha_service.py` L227-232 | 新增 `MAX_STORE_SIZE`(默认 10000,可配置 `max_store`/`CAPTCHA_MAX_STORE`),`_handle_image` 在加锁后先清理过期项,再检查容量,超限拒绝生成并返回错误,防止内存耗尽 |
| P2-1 | ❌ 未修复 | `captcha_service.py` L128 | 仍为进程内存 dict,未迁移至 Redis;当前单实例可接受 |
---
@@ -34,7 +34,7 @@
| 优先级 | 总数 | 已修复 | 待修复 |
|--------|------|--------|--------|
| P0 | 0 | 0 | 0 |
| P1 | 1 | 0 | 1 |
| P1 | 1 | 1 | 0 |
| P2 | 1 | 0 | 1 |
---
@@ -43,7 +43,7 @@
| # | 问题 | 说明 |
|---|------|------|
| P1-1 | 验证码存储无容量限制,大量生成可耗尽内存 | 无验证码数量上限,攻击者可高频调用 `/captcha/image` 生成大量验证码填满内存 |
| P1-1 | ~~验证码存储无容量限制,大量生成可耗尽内存~~ | ✅ 已修复(2026-08-04):新增 `MAX_STORE_SIZE`(默认 10000),`_handle_image` 清理过期后容量仍满则拒绝生成并返回 `too many pending captchas`,防止内存耗尽 |
---
@@ -94,7 +94,7 @@
## 修复路线图
### 短期
- [ ] 添加验证码存储容量上限(如最多 10000 个,超出时清理最早的)
- [x] 添加验证码存储容量上限(默认 10000,超出时拒绝新生成)✅ 已修复(2026-08-04)
- [ ] 添加生成速率限制(单 IP 每分钟最多生成 N 个)
- [ ] 将 `generate_text()` 中的 `random.choices` 替换为 `secrets` 模块