Skip to content
This repository was archived by the owner on Jul 6, 2026. It is now read-only.

安全漏洞修复:修复后端管理员面板认证绕过、DoS 防护缺失等多项安全漏洞,新增 10 项安全验证测试。 - #93

Open
dhjs0000 wants to merge 1 commit into
jiangmuran:mainfrom
dhjs0000:main
Open

Conversation

@dhjs0000

@dhjs0000 dhjs0000 commented May 8, 2026

Copy link
Copy Markdown

Summary

修复后端管理员面板认证绕过、DoS 防护缺失等多项安全漏洞,新增 10 项安全验证测试。

Security Vulnerabilities Fixed

CRITICAL

硬编码管理员密码哈希 (admin_api.py:20)

  • 原代码将 ADMIN_PASSWORD_SHA512 明文写在源码中,任何人接触到仓库即可离线碰撞密码
  • 改为从 ADMIN_PASSWORD_SHA512ADMIN_PASSWORD 环境变量读取,未配置时返回 503 并输出 critical 日志

密码通过 URL Query Parameter 传输 (admin_api.py:156-158)

  • 原版 ?password=xxx 导致密码明文出现在 Nginx 访问日志、浏览器历史、Referer 头
  • 改为 Authorization: Bearer <token> HTTP Header,同步更新 Admin HTML 前端 JS

HIGH

管理员登录无速率限制 → 暴力破解无防护

  • 新增滑动窗口限流:默认 8 次/300 秒,超限返回 429

LLM 高消耗端点无防护 → API 额度可被滥用耗尽

  • 新增全局 RateLimitMiddleware:轻端点 30 req/60s,诊断/优化等重端点 8 req/60s

Form 输入字段无长度校验 → 内存/日志炸弹

  • 新增 _validate_input_fields():title≤200, content≤10000, category≤50, tags≤500
  • 覆盖 /diagnose, /diagnose-stream, /pre-score, /optimize, /generate-comments 所有入口

历史记录 record_id 无格式校验 → 路径穿越/SQL 注入风险

  • 新增正则校验 ^[a-f0-9]{32}$,仅接受合法 hex UUID

MEDIUM

  • CORS: allow_methods/allow_headers["*"] 收紧为显式白名单
  • 新增 BodySizeLimitMiddleware,默认 350MB 上限
  • 临时视频目录新增总量限制(默认 4GB),超限按 LRU 自动清理
  • 管理员页面在密码未配置时返回 503 而非无条件渲染

Files Changed

File Change
backend/app/api/admin_api.py 认证重写、速率限制
backend/app/main.py 全局限流中间件、请求体限制、CORS 收紧
backend/app/api/diagnose.py 输入验证、临时视频总量限制
backend/app/api/history_api.py record_id 格式验证
backend/app/api/comments_api.py 输入字段截断
backend/app/api/optimize_api.py 输入字段截断
.env.example 新增安全配置项文档
backend/tests/test_security.py 新建 — 10 项安全验证测试

Test Results

21 passed (10 new security tests + 11 existing regression tests)

Deployment Checklist

生产环境必须配置:

ADMIN_PASSWORD_SHA512=<sha512-hex-hash>
TEMP_VIDEO_SIGNING_KEY=<32+ char random>
CORS_ORIGIN_OVERRIDE=https://your-domain.com

Breaking Changes

  • /admin/api/stats 不再接受 ?password= 查询参数,必须使用 Authorization: Bearer
  • Admin 面板在未设置 ADMIN_PASSWORD_SHA512ADMIN_PASSWORD 环境变量时返回 503

注意

原密码在Git Log中仍可见,在GPU算力市场中RTX5090的价格通常为3元/小时,RTX 5090的算力是28-35 GH/s(38.4 万亿次/元),意味着含小写字母与数字的密码只需要最多~12 秒就可以完全计算完毕(取8卡并行速率: 235.5 GH/s )。如果你不打算换,需要保证密码有大小写特殊符号且>10位:
字符集: a-z (26)
6位: 308,915,776 | 单卡可扫 372917 遍 | 8卡可扫 2744670 遍
7位: 8,031,810,176 | 单卡可扫 14343 遍 | 8卡可扫 105564 遍
8位: 208,827,064,576 | 单卡可扫 552 遍 | 8卡可扫 4060 遍
9位: 5,429,503,678,976 | 单卡可扫 21 遍 | 8卡可扫 156 遍
10位: 141,167,095,653,376 | 单卡覆盖 81.61% | 8卡可扫 6 遍

字符集: a-z0-9 (36)
6位: 2,176,782,336 | 单卡可扫 52922 遍 | 8卡可扫 389507 遍
7位: 78,364,164,096 | 单卡可扫 1470 遍 | 8卡可扫 10820 遍
8位: 2,821,109,907,456 | 单卡可扫 41 遍 | 8卡可扫 301 遍
9位: 101,559,956,668,416 | 单卡可扫 1 遍 | 8卡可扫 8 遍
10位: 3,656,158,440,062,976 | 单卡覆盖 3.15% | 8卡覆盖 23.19%

字符集: a-zA-Z0-9 (62)
6位: 56,800,235,584 | 单卡可扫 2028 遍 | 8卡可扫 14927 遍
7位: 3,521,614,606,208 | 单卡可扫 33 遍 | 8卡可扫 241 遍
8位: 218,340,105,584,896 | 单卡覆盖 52.76% | 8卡可扫 4 遍
9位: 13,537,086,546,263,552 | 单卡覆盖 0.85% | 8卡覆盖 6.26%
10位: 839,299,365,868,340,224 | 单卡覆盖 0.01% | 8卡覆盖 0.10%

CRITICAL:
- Remove hardcoded ADMIN_PASSWORD_SHA512, read from env var instead
- Move admin auth from URL query param to Authorization: Bearer header
- Add rate limiting to admin login (8 attempts/300s window)

HIGH:
- Add global API rate limiting (30 req/60s light, 8 req/60s heavy endpoints)
- Add input field max length validation (title/content/category/tags)
- Validate history record_id as 32-char hex to prevent path traversal/SQLi

MEDIUM:
- Tighten CORS: allow_methods/allow_headers from wildcard to explicit whitelist
- Add global request body size limit middleware (default 350MB)
- Add temp video directory total size enforcement with LRU eviction
- Admin page returns 503 when password not configured

Tests:
- Add test_security.py with 10 verification tests (all 21 tests pass)
@FlashingChen

Copy link
Copy Markdown
Collaborator

感谢您的贡献!我就这督促队长jmr赶紧去审核(

@FlashingChen FlashingChen left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

看了下,这个 PR 整体挺好的,几个关键问题都抓得准。

硬编码密码那个确实该修,之前那个 SHA512 哈希直接写死在源码里,仓库公开的,谁都能拿去跑。改成环境变量读取、没配置就直接 503,这个处理干净。_get_password_hash 里优先读 ADMIN_PASSWORD_SHA512、没有就用 ADMIN_PASSWORD 自动算哈希,也挺方便,部署的人不用自己先算一遍。

密码从 query string 改 Bearer header 也是对的,原来 ?password=xxx 会被 Nginx 日志、浏览器历史记得到处都是。Admin HTML 里的 JS 也同步改了,没遗漏。

限流和输入校验这些虽然以这个项目的体量来说遇到攻击的概率不大,但加上去没坏处,实现得也算合理。CORS 从 ["*"] 收紧也顺手修了。

测试写得挺全的,尤其是 test_security.py 里直接去读源码文件检查旧哈希还在不在、CORS 有没有被改回 ["*"],这种测试一般人想不到写。

有两个小地方你可以看看,改不改都行:

一个是 diagnose.py 里超长字段直接 400 报错,但 comments_api.pyoptimize_api.py 是静默截断。同一个校验两种行为,后面别人维护容易搞不清该用哪种。

另一个是限流器那个 dict 存时间戳,不同 IP 的老记录只有等那个 IP 下次请求才会清掉,长时间跑着 dict 会越来越大。不过你们这个量级估计也碰不到,不急。

别的没了,但是还得看看有没有隐藏的bug。等jmr看看吧

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants