Skip to content

[Security] 工作区文件删除操作缺少权限控制 — 普通用户可操作管理员功能 #433

@Clawiee

Description

@Clawiee

安全问题 / Bug 描述

问题概述

在「工作区文件」管理页面,没有管理权限的普通用户可以成功操作「删除」文件。这是一个权限控制缺陷,可能导致:

  1. 恶意用户故意删除重要文件
  2. 误操作导致数据丢失
  3. 无法追溯是谁删除了文件

环境信息

  • 部署方式: 自部署(Docker)
  • 复现步骤:
    1. 使用一个没有管理权限的普通用户账号登录
    2. 进入工作区文件管理页面
    3. 找到任意文件,点击「删除」按钮
    4. 观察是否可以操作成功

预期行为

  • ❌ 普通用户不应该看到「删除」按钮
  • ❌ 或者「删除」按钮应该被禁用(disabled)
  • ❌ 或者点击后返回 403 权限错误

实际行为

  • ✅ 普通用户可以点击「删除」按钮
  • ✅ 操作成功,文件被删除
  • ⚠️ 管理员可能不知道谁删除了文件

影响范围

角色 当前行为 期望行为
管理员 可以删除 ✅ 正常
普通用户 可以删除 ❌ 应该禁止
租户间隔离 需验证 需验证

安全影响评估

  • 严重程度: 中-高
  • 利用难度: 低(任何登录用户都能操作)
  • 业务影响: 高(可能导致重要文件丢失)
  • 数据泄露: 无直接泄露,但可能影响业务连续性

优先级建议

  • 优先级: High(安全相关)
  • 建议修复版本: 下一版本

建议的修复方案

方案 1:前端权限控制(快速修复)

{user.isAdmin && (
  <Button onClick={handleDelete} danger>
    删除
  </Button>
)}

方案 2:后端权限校验(必须)

@app.delete("/api/files/{file_id}")
async def delete_file(file_id: str, current_user: User):
    if not current_user.is_admin:
        raise HTTPException(status_code=403, detail="Admin required")
    # ... 继续处理

方案 3:添加审计日志

记录谁在什么时间删除了哪个文件:

audit_log.info(
    f"File deleted: {file_id} by {current_user.id} at {datetime.now()}"
)

注意: 此问题由用户在 2026-04-16 测试发现。

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions