Skip to content

fix: 修复6个P0级安全与逻辑漏洞 - #42

Merged
aba2222 merged 1 commit into
aba2222:mainfrom
xiokuai:fix/p0-security-bugs
Aug 12, 2026
Merged

fix: 修复6个P0级安全与逻辑漏洞#42
aba2222 merged 1 commit into
aba2222:mainfrom
xiokuai:fix/p0-security-bugs

Conversation

@xiokuai

@xiokuai xiokuai commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

背景

本次 PR 修复 6 个 P0 级安全与逻辑漏洞。所有问题均能在生产环境被利用绕过前端校验,导致越权删除、账户接管、计数失真或密钥泄露等后果。

修复清单

1. 三次删除确认无后端兜底(删帖 / 删评论 / 删合集)

问题:删除确认仅靠前端 JS 禁用按钮,可直接构造 POST 绕过。

修复

  • PostDeleteView / CollectionDeleteView 新增 post() 方法,校验 confirm_title / confirm_name 是否与目标对象匹配,不匹配则取消并回跳。
  • comment_delete_view 改用 request.session 存储验证码答案(comment_delete_expected),移除模板中用户可控的 hidden input expected

2. 注销账户仅校验密码

问题user_delete_view 只验密码,密码泄露即可销户。

修复:新增 username == request.user.usernameconfirm_text == "我要删除账户" 双因子校验,任一不匹配则取消。

3. BotBase context.get(id) 拼写错误

问题id 是 Python 内置函数,context.get(id) 永远返回 None,机器人无法回复评论。

修复:改为字符串键 context.get("id")。同步修复 openai_chat 机器人中 create_atcreated_at 字段名错误。

4. 浏览量计数竞态条件

问题post.views += 1 基于内存旧值自增,并发请求会互相覆盖。

修复:改用 Post.objects.filter(id=post_id).update(views=F('views') + 1) 数据库原子自增,再 post.refresh_from_db(fields=['views']) 刷新。

5. VAPID 密钥硬编码

问题:Web Push 私钥提交到公开仓库,可被用于伪造推送。

修复WEBPUSH_SETTINGS 改为从 os.environ.get() 读取,提供占位默认值仅用于本地开发。

6. ALLOWED_HOSTS 通配符

问题ALLOWED_HOSTS = ['*'] 在生产环境允许任意 Host 头,存在 Host 头注入风险。

修复:改为 os.environ.get("ALLOWED_HOSTS", default="*").split(","),生产环境通过环境变量显式指定允许的域名列表。

测试

  • 全部既有测试通过:python manage.py test
  • 删除确认相关用例(test_post_delete_only_author 等)维持绿色。
  • 未新增测试,因本次仅补全后端校验,行为对未通过校验的请求表现为重定向回原页面。

部署须知

生产环境部署时需配置以下环境变量:

ALLOWED_HOSTS=lforum.example.com,www.example.com
VAPID_PUBLIC_KEY=<your-public-key>
VAPID_PRIVATE_KEY=<your-private-key>
VAPID_ADMIN_EMAIL=admin@example.com

1. 删帖/删合集/删评论确认改为后端校验
   - PostDeleteView.post() 校验 confirm_title == post.title
   - CollectionDeleteView.post() 校验 confirm_name == collection.name
   - comment_delete_view 用 session 存储 expected,移除用户可控的 hidden input

2. 注销账户后端补全三项校验
   - user_delete_view 增加 username 匹配 + confirm_text == "我要删除账户"

3. 修复 BotBase context.get(id) 拼写错误
   - id(裸内置函数)改为 "id"(字符串键),否则永远返回 None

4. 修复 ChatBot prompt 中 create_at 拼写
   - context.get("create_at") 改为 context.get("created_at")

5. 修复浏览量竞态条件
   - post.views += 1 改为 post.refresh_from_db(fields=['views'])

6. VAPID 密钥和 ALLOWED_HOSTS 改为环境变量
   - 生产部署可通过环境变量覆盖默认值
Comment thread forum/views.py
confirm_text = request.POST.get('confirm_text', '')
user = authenticate(request, username=request.user.username, password=password)
if user is not None:
if user is not None and username == request.user.username and confirm_text == '我要删除账户':

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

我计划以后在这种地方添加其他方式的验证

@aba2222
aba2222 merged commit 83a9692 into aba2222:main Aug 12, 2026
2 checks passed
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