Skip to content

-
-分钟

project-admin 审计

审计时间:2026-08-23

运行模型

project-admin 是仅供仓库所有者在本机运行的单用户工具,固定监听 127.0.0.1:8888,开发模式是主要使用方式,不会部署到公网。因此,没有认证、会话和权限系统是明确的设计选择,不作为缺陷记录。

如果未来允许非本机访问,这一威胁模型即失效,必须另行设计认证、授权、CSRF、防滥用和操作审计。

本轮已处理问题

[P3] Express 5 生产 fallback 无法注册

  • 状态:已修复。
  • 位置project-admin/server/frontend.js
  • 处理:将 Express 4 风格的 app.get('*') 改为 Express 5 支持的 app.get('/{*path}')
  • 定级说明:生产模式仅用于构建产物冒烟,后台的主要运行方式是开发模式,因此按 P3/非主要目标记录,不再作为 P0。

[P2] 文章 ID 可越过文章目录

  • 状态:已修复。
  • 位置project-admin/server/lib/posts.js
  • 处理:读取、更新和删除统一通过路径解析器,只接受 pages/posts 下的 Markdown;同时校验解析路径与 realpath,拒绝 .. 越界、非 .md 文件和符号链接逃逸。
  • 定级说明:在本地单用户模型下主要影响数据完整性,不是公网远程文件读取漏洞。

[P1] 导入富文本可在后台源执行脚本

  • 状态:已修复。
  • 位置project-admin/server/lib/posts.jsproject-admin/server/lib/radios.jsproject-admin/server/lib/sanitizeHtml.js
  • 处理:Markdown 在渲染阶段只清洗用户原始 HTML token,保留受信渲染器生成的 MathJax、Mermaid 和 MarkMap;RSS 描述和电台覆盖描述使用最终 HTML 允许列表。两条路径都会移除脚本、事件属性和危险协议,新窗口链接补充 noopener noreferrer
  • 定级说明:即使工具仅本地运行,恶意导入内容仍可能以同源身份调用文件写 API,因此保留 P1。

[P2] 友链外部请求缺少网络和资源边界

  • 状态:已修复。
  • 位置project-admin/server/lib/networkSafety.jsproject-admin/server/tasks/updateFriendsTask.js
  • 处理:页面和图片只允许公网 HTTP/HTTPS URL;拒绝 localhost、回环、私网、链路本地和带凭据地址,实际连接固定到已验证 IP,重定向逐跳复验。Chromium 恢复默认沙箱且不再直接联网,所有页面资源由受控下载器提供,并限制为 200 个请求、单资源 10 MB、页面总计 50 MB;任务统一复用已解码的仓库根路径,兼容含中文的本地目录。
  • 定级说明:按本地工具中的误配置、内网访问和资源消耗风险定为 P2,不按公网未鉴权 SSRF 定级。

[P2] 回忆上传没有体积、数量、类型和像素限制

  • 状态:已修复。
  • 位置project-admin/server/app.jsproject-admin/server/lib/nostalgia.jsproject-admin/server/middleware/errorHandler.js
  • 处理:限制单文件、20 MB、最多 8 个字段和图片 MIME;Sharp 验证真实格式并限制 6000 万像素;无论成功失败都清理临时文件,文件体积超限返回 413,其他 Multer 数量/字段限制返回 400。
  • 定级说明:这是本地可靠性和资源控制问题,按 P2 记录。

[P2] 友链保存接受非数组

  • 状态:已修复基础边界。
  • 位置project-admin/server/lib/friends.js
  • 处理:非数组请求直接返回 400,避免保存后下一次读取因 .map 崩溃。
  • 剩余限制:尚未对每个友链条目实施完整 schema 校验。

仍存在的问题

[P2] 任务运行记录和日志无限增长

  • 位置project-admin/server/lib/tasks.js
  • 影响:长时间重复触发高输出任务会增加进程内存占用。
  • 建议:限制并发、单任务日志字节数、记录数量和保留时间。

[P2] 首屏关键请求失败后缺少恢复入口

  • 位置project-admin/src/App.jsxproject-admin/src/views/Home.jsx
  • 影响:短暂请求失败可能留下空白概览,用户需要整页刷新。
  • 建议:提供明确的 loading、error 和按模块重试状态。

验证范围

  • 后台开发模式 E2E 覆盖概览、文章、电台、回忆、友链、设置、主要 GET API 和移动端横向溢出。
  • 安全回归测试覆盖 Express 5 fallback 注册、文章路径越界、HTML 清洗、URL 公网判定及图片元数据限制。
  • 生产模式构建和启动已通过;根路径、任意客户端路由 fallback 及 /api/system/status 均返回 200。该结果只代表兼容性冒烟,不扩展为部署支持承诺。
正在连接 GitHub评论区马上就来...