安全与发布
第三方主题属于供应链输入。平台的校验与 sandbox 能缩小风险,但不能替代源码审查、许可证确认与可复现发布。
平台校验上限
| 项目 | 限制 |
|---|---|
| ZIP 压缩体积 | 最大 8 MiB |
| 解压后总体积 | 最大 16 MiB |
| 单文件体积 | 最大 4 MiB |
| 文件数量 | 最大 300 |
manifest.json | 最大 64 KiB,UTF-8 JSON |
| 路径深度 | 最大 8 层 |
| 单路径长度 | 最大 180 字符 |
| CSS 文件 | CSS 主题 1–4 个 |
| Canvas 高度 | 400–12000 |
上传必须使用 ZIP Content-Type,并携带浏览器计算的 x-theme-sha256。Worker 重新计算整个包的 SHA-256,不一致时拒绝。x-extension-sha256 仅为旧主题客户端兼容头,不代表插件能力;新工具只发送 x-theme-sha256。
Manifest 校验
schema必须是nie-sla-theme-v1。id3–49 位小写字母、数字或连字符,以字母开头,发布后保持稳定。version必须是 SemVer。type固定theme。- CSS 模式需要 1–4 个包内样式文件;Canvas 模式需要入口 HTML。
permissions只能是["status:read"]。files若填写,必须与 ZIP 内文件完全一致。- 路径必须是 NFC Unicode;绝对路径、反斜杠、
..、控制字符与重复路径被拒绝。 - 允许
.css、.html、.js、.json、常用网页图片与 WOFF/WOFF2 字体。
供应链与发布
- 从源码构建干净产物,不使用开发服务器输出。
- 明确作者、版本、许可证与源码地址,不伪装官方主题。
- 单独发布 ZIP SHA-256:
shasum -a 256 theme.zip。 - 更新保持
id不变并提高 SemVer;覆盖上传后由管理员重新启用。 - 先在测试部署验证,再在生产启用。
- 运行包不接受无扩展名
LICENSE/NOTICE或 Markdown 文件;完整许可证保留在源码仓库与 Release 页面,ZIP 用 Manifest 的license字段声明。
运行时隔离
CSS 主题不执行脚本。Canvas 主题运行在无同源权限的 sandbox iframe 中,CSP 禁止直接联网、表单与顶层导航;数据只通过消息协议提供。插件上传 API 与插件运行时均未开放。
管理员只应启用可信来源的主题。平台校验防误传与常见绕过,不防恶意作者主动投毒——源码审查与许可证确认仍是管理员责任。