# BD-2026-015 — Account avatar Status: Approved **ECR:** ECR-015 **Date:** 2026-08-13 **Change Level:** L2 **Risk:** Low **Retrospective:** true ## Backend Change Boundary ### In - `users.avatar_url` (varchar) - Package `internal/avatar`:Store / ResolveAbs · MaxBytes 2MiB · jpeg/png/webp - Auth `POST /me/avatar`(需登录)→ 写盘 + 更新 DB - Public `GET /media/avatars/:file`(无鉴权读) - OpenAPI ### Out - S3/COS · 图片审核 SaaS · 多人头像/档案头像分离 ## Data flow ```text H5 MinePage → multipart POST /auth/me/avatar → avatar.Store(data/avatars, userID, file) → auth_repo SET avatar_url=/api/v1/media/avatars/{user_id}.ext → return AuthUser GET /media/avatars/:file → ResolveAbs(防 ..)→ File ``` ## Migration YES — `000018_user_avatar.up.sql` ## Security - 扩展名/Content-Type 白名单 - 大小上限 2MB - ResolveAbs 禁止路径穿越 - 文件名绑定 user UUID(覆盖旧文件) ## Test - avatar Store 拒超大/拒坏类型 - ResolveAbs 拒 `../` - 可选:handler 冒烟 ## Rollback - 停用 Upload 路由;列可留;磁盘文件可人工清