POST /image/check/:imageId
Bearer JWT(supabaseAuth())
| 参数 | 位置 | 说明 |
|---|
imageId | path | 图片 ID(decodeURIComponent 解码)。可以是新 uuid 或 legacy path 形态 |
无请求体。
{ "ok": true, "skipped": true }
ok — 检查通过(或被跳过)始终为 true
skipped — 仅当命中 gen_ 跳过逻辑时为 true,否则字段不出现(undefined)
| 状态码 | 含义 |
|---|
| 401 | 无 JWT / jwtPayload.sub 缺失 |
| 400 | imageId 缺失,或越权(imageId 必须以 userId 开头),或检测过程抛错 |
| 451 | 命中 CSAM,body 为 {"errorCode":"csam_blocked"}(JSON 字符串) |
checkImageCsam(imageId, userId, deps)(src/hono/image/csam.ts):
- 越权校验 —
imageId 不以 userId 开头 → 抛错(被外层转 400)
- 跳过生成图 — 文件名以
gen_ 开头(AI 生成结果,已在生成链路审过)→ action: "skip",返回 { ok: true, skipped: true }
- CSAM 检测 — 取原图一次性签名 URL(
getMessageAllUrls),过 detectCsamFromUrl
- 命中处理 —
action: "block":先经 cdnClient.deleteAssets 清掉原文件 + gen_/blur_/thumb_ 派生前缀,记 csam.blocked.image_upload warn 日志,handler 抛 451
CSAM 阈值为 0.01(ultra-conservative,由 owen 拍板,见 kira-cdn)。删除失败仅 log,不重试。
src/hono/image/index.ts(POST /check/:imageId)+ src/hono/image/csam.ts(checkImageCsam)