Skip to content

-
-分钟

project-admin 设计说明

目标与非目标

project-admin 的目标是为仓库所有者提供一个低成本的本地内容管理界面,直接读取和更新博客仓库中的 Markdown、JSON、图片及构建任务。

它明确不承担以下职责:

  • 不作为公网或局域网共享服务部署。
  • 不提供登录、会话、角色、权限和多用户并发编辑。
  • 不把本地文件操作抽象成通用文件管理 API。
  • 不保证生产模式具备长期托管所需的隔离、审计和运维能力。

运行架构

text
本机浏览器
    |
    | http://127.0.0.1:8888
    v
Express API + Vite 开发中间件
    |             |
    |             +-- 开发模式界面与 HMR
    |
    +-- pages/posts、data、public 及本地任务
    |
    +-- 受限制的公网 HTTP/HTTPS 抓取

服务地址由 server/serverConfig.js 固定为 127.0.0.1:8888。开发模式是主要工作流;生产模式仅加载已构建的 dist,用于构建产物验收。Express 5 fallback 已使用命名通配符路由修复,但该路径按 P3/非主要目标维护。

组件职责

组件职责
src/管理界面、路由和交互状态
server/routes/HTTP API 边界和请求分发
server/lib/文章、广播、回忆、设置等领域读写与校验
server/tasks/构建、上传、友链抓取等长任务
data/后台覆盖项、设置和任务辅助数据
scripts/dev.js本地开发进程和界面监听

代码风格

项目 JavaScript/JSX 函数统一使用 const name = (...) =>export const name = (...) =>。箭头函数转换只适用于不依赖函数自身 thisarguments、生成器或构造器语义的函数;对象方法、回调和第三方接口要求的动态 this 保持原有语义。

信任模型

唯一受信任主体是正在本机操作仓库的用户。未受信任输入主要来自:

  • 导入或编辑的 Markdown、RSS 和富文本内容。
  • 友链中的页面、头像 URL 及其重定向目标。
  • 上传的图片文件、元数据和解码后的像素尺寸。
  • API 中代表文章路径的编码 ID。

缺少认证不是漏洞,而是单用户、仅回环监听模型下的设计选择。这个结论以服务不被代理、转发或改成非回环监听为前提;一旦运行边界变化,就必须重新设计认证、授权、CSRF、防滥用和审计机制。

安全与可靠性决策

边界实施措施目的
文章文件路径解码后限制在 pages/posts,只接受 .md;同时用 path.relativerealpath 校验防止目录越界和符号链接逃逸导致误读、误改或误删
富文本输出Markdown 只清洗用户提供的原始 HTML token,保留受信渲染器生成的 MathJax、Mermaid 和 MarkMap;电台 RSS 描述和覆盖描述使用最终 HTML 允许列表阻止脚本和事件处理器,同时保留既有预览语法
外部 URL只接受 HTTP/HTTPS,拒绝凭据、localhost、回环、私网、链路本地和其他非公网地址;实际套接字使用已验证地址,重定向逐跳复验限制友链抓取访问本机或内网资源并避免 DNS 重绑定
友链页面Chromium 使用默认沙箱,页面的 HTTP/HTTPS 请求由受控下载器响应,不允许浏览器直连;最多 200 个请求、单资源 10 MB、页面总计 50 MB限制不受信页面的网络与资源消耗
外部图片设置超时、重定向次数和 10 MB 响应上限;Sharp 使用有限像素解码避免异常远端响应消耗过多内存或处理时间
回忆上传单文件、20 MB、最多 8 个字段、图片 MIME;真实格式允许列表和 6000 万像素上限控制临时磁盘、内存和图片解码资源
上传清理无论成功失败都删除 Multer 临时文件,大小超限返回 413避免失败上传持续占用磁盘
前端 fallbackExpress 5 使用 /{*path} 命名通配符保留构建产物冒烟能力,不将其提升为部署承诺

已接受限制

  • 本机其他进程可以访问回环端口;系统账户和浏览器环境仍属于部署者的安全边界。
  • API 可以修改仓库内容,这是工具的核心用途;提交前仍应通过 Git diff 审核和版本控制恢复误操作。
  • 外部网站可能很慢、不可达或拒绝自动访问;友链更新采用失败降级,不承诺所有截图和头像都能生成。
  • 生产模式仅做兼容性冒烟,不代表后台适合长期运行或远程暴露。

变更记录

2026-08-23

  • 明确本地单用户威胁模型和非部署目标。
  • 修复 Express 5 静态 fallback 路由。
  • 增加文章目录边界、富文本清洗、外部 URL 公网限制和上传资源限制。
  • 友链任务统一复用解码后的仓库根路径,兼容包含中文等非 ASCII 字符的本地目录。
  • 增加对应安全回归测试和后台开发模式 E2E 说明。
  • 测试用例统一归档到仓库根目录 test/admin/project-admin/ 只保留后台实现代码。

2026-08-23 - 统一箭头函数风格

  • project-admin/serverproject-admin/srcproject-admin/scripts 中可安全转换的函数声明统一为箭头函数。
  • 保留需要动态上下文或特殊语言语义的函数形式,并通过构建、单元测试和 E2E 验证行为未变。

上次更新:

正在连接 GitHub评论区马上就来...