Skip to content

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

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

Conversation

@dhjs0000
Copy link
Copy Markdown

@dhjs0000 dhjs0000 commented May 8, 2026

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)
@FlashingChen2024
Copy link
Copy Markdown
Collaborator

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

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants