Open
feat(cloud): 为 db-init 增加可选 ADMIN_TOKEN 保护 (#2) #2
feat(cloud): 为 db-init 增加可选 ADMIN_TOKEN 保护 (#2) #2
Open
雅皮士Add on 9 days ago
雅皮士
雅皮士
9 days ago

变更说明

针对 Issue #2 的安全边界,为 db-init 增加一层可选的访问保护。db-init 当前以 execute=["any"] 部署,任何匿名调用方都能触发建库/重建,存在误操作或滥用风险。

变更内容

在 harmony_cloud/functions/db-init/main.js 的处理入口增加 ADMIN_TOKEN 校验:

  • 设置了环境变量 ADMIN_TOKEN:调用方必须携带匹配的 x-admin-token 请求头,否则返回 unauthorized;
  • 未设置 ADMIN_TOKEN:行为与现在完全一致(向后兼容),仅在函数日志中输出告警,提示该函数仍可公开调用。
const adminToken = process.env.ADMIN_TOKEN || '';
if (adminToken) {
  const provided = req.headers['x-admin-token'] || '';
  if (provided !== adminToken) {
    return res.json(fail('unauthorized: missing or invalid x-admin-token'));
  }
} else {
  log('WARN: ADMIN_TOKEN not set; db-init is publicly callable...');
}

使用方式

在 Appwrite 控制台为 db-init 函数设置环境变量 ADMIN_TOKEN=<随机强口令>,之后调用需附带:

curl -X POST http://<host>/v1/functions/db-init/executions   -H "X-Appwrite-Project: <project_id>"   -H "x-admin-token: <ADMIN_TOKEN>"   -H "Content-Type: application/json"   -d '{"body":"{}","async":false}'

说明与边界

  • 这是渐进式、向后兼容的部分缓解,不改变默认演示流程(不设置即不启用)。
  • 完整的鉴权(会话认证、越权校验、限流、HTTPS)仍需按 Issue #2 建议整体改造,本 PR 不覆盖。
  • 仅修改云函数单文件,不涉及端侧与部署脚本。

Refs #2

likedislike
Merge blocked
雅皮士雅皮士
9 days ago Associated issue: [Security][P1] 云函数 execute=["any"] 无鉴权 + db-init 公开可调用,存在越权与滥用风险