2.7 KiB
2.7 KiB
内容限制与隔离边界
文件白名单
- 仅允许根目录
index.txt和posts/<目录>/<文件>内的.txt/.md/.markdown/.png/.jpg/.jpeg/.webp普通文件;扩展名使用小写。 - 拒绝证书扩展名、隐藏文件、
.gitignore、脚本、配置、符号链接、可执行位、子模块和其他类型。 - 文本中的 PEM 证书/密钥标记也会拒绝。
- Git 接收层能直接拦截,因此非白名单内容使整次推送失败,不静默改变作者提交。
容量配额
- 每个文本文件上限 256 KiB;图片单张 2 MiB、每目录最多 12 张、尺寸 4096×4096;每个目录合计 6 MiB。
- 每位作者最多 1000 个目录、14001 个文件、原始文件合计 64 MiB;全站导入快照另限 64 MiB、1000 篇,超出时等待管理员处理。
Git 接收限额
- Git 输入 pack 上限 8 MiB;全部作者接收仓库合计达到 256 MiB 后拒绝新 SSH 会话,需要管理员离线维护。
- 此阈值是应用检查,生产还应为 Docker 数据盘配置真实文件系统配额。
正文解析
- 使用成熟 Markdown 解析器,拒绝原始 HTML、危险链接协议、外链图片、控制符和双向隐藏字符;代码块是惰性文本,绝不执行 MDX、JS、仓库脚本、构建任务或上传内容。
SSH 命令与密钥
- 支持 Ed25519 和 2048–8192 位 RSA 公钥,拒绝弱密钥、负数/畸形 RSA 参数及额外二进制数据;拒绝把
authorized_keys选项当作公钥上传。 - SSH 只接受精确的
git-receive-pack 'content.git'/git-upload-pack 'content.git',没有 shell、SCP/SFTP、TTY、转发、隧道、用户环境变量。
进程与存储隔离
- 接收仓库由 UID 10002 管理;API 为独立 UID 10001,正式仓库/用户密码文件不挂载给 SSH 容器;SSH 只读授权文件和只读固定 hook。
- 接收内容再次验证后才导入 API 自己的按作者隔离的 Git 缓存与阅读快照。
HTTP 与账户限额
- HTTP 请求体 8 KiB;注册/登录合计全局 10 次/分钟,修改操作全局 60 次/分钟;密码哈希并发最多 2。
- 1000 用户、1000 个有效会话上限,一小时固定会话期限。
- 全局限制偏保守,后续可细化 IP/账户限制以改善公平性。
统计与隐私
- 统计不收集 IP/访客身份:公开文章数、标签数、Markdown 字节数、启动以来文章 API 请求数。
- 请求数不是独立访客数,重启后清零。
前端接入
- 服务器只返回 JSON Markdown 与图片;后续前端必须把元数据当文本输出,并继续禁用原始 HTML、MDX和危险链接,不能将接口字段直接作为 HTML 执行。
- 隔离不能替代 Git/OpenSSH/解码库的持续安全更新。