安全与发布
第三方扩展属于供应链输入。平台的校验和 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 |
| 插件高度 | 200–1200 |
上传必须使用 ZIP Content-Type,并携带浏览器计算的 x-extension-sha256。Worker 会重新计算整个包的 SHA-256,不一致时拒绝。
允许的文件
运行文件仅允许:
text
.css .html .js .json .png .jpg .jpeg .gif .webp .svg .woff .woff2ZIP 根目录还可包含 LICENSE 和 NOTICE。空文件、重复路径、绝对路径、反斜杠路径、..、控制字符、末尾空格/点、非 NFC 路径和过深目录都会被拒绝。
Manifest 完整文件清单
推荐始终声明 files:
json
{
"files": [
"manifest.json",
"index.html",
"main.js",
"styles.css",
"LICENSE"
]
}一旦提供,数组必须与 ZIP 中的全部文件完全一致。这样可以避免构建缓存、未审查脚本或 sourcemap 被意外发布。
运行时隔离
Canvas 主题和插件 HTML 使用:
sandbox="allow-scripts",不授予同源能力;default-src 'none';- 脚本、字体和图片只能来自扩展包自身;
connect-src 'none',禁止主动联网;- 禁止表单、对象、媒体、Worker、子 frame 和顶层导航;
- Referrer Policy 为
no-referrer; - Permissions Policy 禁止相机、麦克风、定位、支付、USB 和全屏。
SVG 还会使用更严格的独立 sandbox 与 CSP。
发布者清单
每个正式版本应提供:
- 独立源码仓库与明确许可证;
README、CHANGELOG和安全联系方式;- SemVer 版本与对应 Git tag;
- 从干净 checkout 构建的 ZIP;
SHA256SUMS;- 第三方字体、图片与代码的许可证清单;
- 桌面与移动端测试结果;
- 已知兼容版本与限制。
计算校验值:
bash
shasum -a 256 release/example-theme-1.0.0.zip管理员审查清单
- 从作者发布页取得 ZIP 和 SHA-256,不使用聊天中的临时文件;
- 对照 tag 阅读源码和构建脚本;
- 检查 ZIP 文件清单、许可证和体积;
- 在测试部署上传,确认新包默认停用;
- 核对后台显示的包哈希;
- 启用后测试窄屏、离线状态、超长文本和错误状态;
- 观察浏览器控制台和 Worker 日志;
- 生产启用前准备回退到内置主题的步骤。
明确禁止
- 在扩展中索取或保存管理员密码、Session、TOTP 或 Agent Token;
- 打包
.env、生产响应、真实 IP 清单或内部域名; - 用
innerHTML渲染未经转义的 API 文本; - 绕过消息协议访问管理 API;
- 指纹识别、遥测、广告、挖矿或隐蔽网络请求;
- 使用与源码 tag 不一致的预构建 ZIP;
- 远程加载可在发布后无审查变更的脚本。
隔离不是信任证明
通过平台上传校验只表示包格式符合要求,不表示内容可靠、设计可用或许可证合规。启用第三方扩展前仍需完成供应链审查。