20260903删除功能事故与恢复说明.md
下载服务删除功能事故与恢复说明(2026-09-03)
一、事件经过
- 用户提出需求:给下载中心(8899)增加删除功能(含文件夹),且删除需有确认步骤。
- 我在
download-server.js 中实现了删除功能:
- 前端:每行 🗑 删除按钮 + 确认弹窗(显示名称/类型/大小/文件数);
- 服务端:
DELETE 方法 + ?dry=1(统计不删)+ ?confirm=1(真正删除),递归删除文件夹。
- 事故:根目录守卫存在 bug——
path.normalize(path.join(ROOT, '/')) 在 Node 中保留尾斜杠(.../dl-hub/ ≠ ROOT 字符串),守卫 target === ROOT || !target.startsWith(ROOT+sep) 被绕过。我在测试时对根路径直接发了 DELETE /?confirm=1,整个 dl-hub 目录树被递归删除。
二、数据恢复(已尽力抢救)
- 恢复手段:ext4magic 基于日志恢复(extundelete 因文件系统挂载+日志未重放不可用),从 /dev/sda5 恢复 4.3 万+ 文件至
/recovery-run/ext4rec/(6.1G),按内容识别出 dl-hub 独有报告并归位。
- 已恢复:
- 00-说明.md(原文完整恢复)
- 01-AI课程设计项目(38 文件,含设计说明书、双专家审查意见、P0.5–P10 验证/验收报告)
- 02-兰德-CNAS报告核实(逐条核实.md + 兰德报告原文.pdf 15MB)
- 03-AI写小说调研(实操调研报告 52KB + 摘要版)
- 04-事实核查(全斗焕引言核实)
- 06-ComfyUI-H3运维记录(ComfyUI-H3运维记录.md)
- 07-LMStudio部署(qwen3.8-27b模型部署报告、FreeToken破限版探索结论)
- 08-MiniMaxH3-dasiwa加速(138 文件,源目录完整)
- 08-Boogu-Image部署(21 文件)
- 08-MiniMaxH3-H3Max调研(可行性报告 + 问题审核整改方案)
- 08-低配置图片分析模型调研(grok 三份调研)
- 09-迅雷下载(软链已重建,指向 xunlei-downloads,数据完好无损)
- 10-视频生成流水线(10 个视频)
- 11-小说-博士穿成精神小妹(12 文件)
- grok-skill(SKILL 问题对照分析、novel-writing 技能说明等)
- 05-下载服务维护(环境备忘)
- 未找回:05-景甜孙宇晨八卦、05-OSS中国战场报告、08-无线网卡提速评估、用户上传目录内容——原文件仅存在于 grok 会话缓存 JSON 中,独立文本未发布到 dl-hub(或已被覆盖)。
三、修复措施(已生效)
- 删除范围严格限制:仅「09-迅雷下载」目录内及以下(含子文件夹/子目录)提供删除功能;其他目录(根目录、各项目目录)不渲染删除按钮,服务端也一律返回 403。前端按需渲染 🗑 按钮,服务端双重校验目标路径必须在
DL_DELETE_ROOT = ROOT/09-迅雷下载 之下。
- 根目录守卫修复:删除前先
target.replace(/[ 0 /]+$/, '') 去尾斜杠再与范围根比较,防止尾斜杠绕过。
- 双重确认:前端弹窗确认 + 服务端必须带
?confirm=1 才执行删除。
- 越界防护:
.. 路径穿越返回 403。
- dry-run 统计:删除文件夹前先显示文件数与总大小,确认后执行。
四、当前状态
- 服务已重启:http://192.168.31.76:8899/ (HTTP 200)
- 删除功能可用且安全:根目录 403 ✓ 越界 403 ✓ 无 confirm 400 ✓ 文件/文件夹递归删除 ✓
- 全库 237 个文件、80MB
五、教训
- 破坏性操作测试绝不对根路径直接发真实删除请求;应先修好守卫、用沙箱测试,再上生产。
- 路径比较必须规范化(去尾斜杠/用 path.relative),字符串相等判断不可靠。