初春图床 v3.5.6 更新来了!这次是一个含金量很高的版本:在 v3.5.5 基础上合并了社区大佬 @hicocos 的 PR #32,并完成了一次覆盖 6 大子系统的全面安全审计与修复(3 High / 4 Medium / 10 Low),构建产物也全部改为 UPX -9 压缩的静态二进制。
⚠️ 特别提醒:本次发布之前的所有版本(含 v3.5.5 / v4.5.5 及更早)都受一个 Host 头注入漏洞影响,建议所有旧版本立即更新!
⚠️ 安全通告:Host / X-Forwarded-Host 注入
未认证接口(如 GET /api/images/random)返回的图片 URL 基址,此前完全取自请求的 Host / X-Forwarded-Host / X-Forwarded-Proto 头。攻击者无需任何凭据,即可让服务端在响应中输出指向任意主机的图片链接:
curl -H 'X-Forwarded-Host: evil.example.com' 'http://your-host/api/images/random?limit=1'→ {"url":"http://evil.example.com/uploads/2026/08/xxx.webp"}在存在缓存 / 反向代理的部署中,可造成缓存投毒与外链劫持。
修复(随 PR #32 合入,本版本已包含):图片 URL 基址现在只取服务端配置的 APP_URL,不再信任任何请求头;APP_URL 未配置或非法时返回相对路径。升级后请务必在 .env 中将 APP_URL 设为实际访问地址。
暂时无法升级的缓解措施:
- 反向代理固定
Host(如 nginxproxy_set_header Host example.com;),并剥离客户端传入的X-Forwarded-Host/X-Forwarded-Proto; - 同时不要缓存未认证的 API 响应。
来自社区 PR #32:R2 独立存储、图库文件夹与权限管理
[新增] Cloudflare R2 独立存储与传输优化
- 将 Cloudflare R2 作为独立存储类型,与通用 S3 存储分别配置和管理,提供 R2 专用的端点及 CDN 配置。
- 优化上传链路:支持浏览器直传、服务端校验与后台处理、任务状态恢复,以及直传失败时的中转回退。
- 优化访问与下载链路:保留稳定图片外链,在适用场景下跳转至 R2 临时签名链接或配置的 CDN,减少图床服务器转发图片的流量;需要解密或动态水印的图片仍由服务端处理。
[新增] 图库逻辑文件夹
- 新增账号隔离的逻辑文件夹,支持创建、描述、重命名、筛选和批量移动,不改变图片实际存储路径或外链。
- 上传页以文件夹选择替换标签区;保留已有标签数据及相关接口。
- 将「我的图库」和管理员「总图库」分开:个人列表强制按当前账号查询,总图库使用管理员接口并显示上传者。
- 目录式列表、面包屑、搜索排序、列表/网格切换,以及移动端布局优化。
- 删除文件夹默认保留图片;可选连带删除,需输入完整名称确认。大批量删除分批处理,失败保留记录并支持重试。
- 文件夹关联贯穿普通上传、URL 上传及 R2 直传流程。
[优化] 存储与权限管理
- 存储管理顶部提供紧凑的「角色存储配置」弹窗,管理员、普通用户、游客均可多选存储源。
- 区分角色统一分配与个人额外授权,上传接口及直传任务重新校验有效存储权限。
- 用户管理拆分存储授权和功能权限操作,分别保存、读取确认,避免覆盖另一类授权。
- 修正空授权数组被显示为「0 个存储/0 个权限」的问题,区分默认可用能力、额外授权和超管权限。
- 整理存储驱动、同步、删除与容量核算逻辑,保留失败清理记录。
[优化] 认证、稳定性与构建
- 整理 Cookie 会话、游客身份恢复、API 凭据权限、外部登录、会话管理和登录记录。
- 完善上传内容校验、请求边界、来源检查及错误响应;SVG 不再作为普通图片接受上传。
- 图库列表不再等待上传配置等辅助请求;加载中、失败和真实空结果分别展示。
- 拆分较大的 Go 控制器/服务与 Vue 页面组件;更新依赖、通用 Dockerfile 和构建上下文忽略规则。
安全审计修复(v3.5.6 新增)
对合并后的 v3.5.5 基线代码进行了 6 个子系统的专项安全审计(认证会话 / 访问控制 / 加密配置 / SSRF 网络 / 上传管线 / 文件存储),修复全部 High 与 Medium 问题:
- [High] 权限提升链修复:
multi_storage_sync模式下更新用户权限时,超管/自身保护被整体旁路,持委托权限码的用户可给自己添加全部权限码。现权限码修改无条件执行保护。 - [High] SSRF 修复:
/api/buckets与/api/buckets/test原先无权限码,任意登录用户可令服务器探测内网。现需要 storage 权限码。 - [High] 配置密钥强度校验:显式设置的
CONFIG_SECRET现强制 ≥32 字符。 - [Medium] CORS / CSP 收紧:localhost 放行仅限
APP_URL本身为 localhost;CSP script/connect/frame-src 收敛为白名单。 - [Medium] Telegram 通知修复:原先使用加密密文直接调用 API 导致通知必然失败,现正确解密后发送。
- [Medium] 上传 DoS 防护:慢速请求体不再能无限占用全局上传槽(60s 空闲中断 + 15 分钟兜底释放 + 直传回退纳入槽约束)。
- [Low] ×10:登录时序账号枚举抹平、修改密码接口独立限流、
{random}改用加密随机数、{filename}消毒防目录注入、剥离 bidi 欺骗字符、Windows 盘符路径解析修复、URL 上传标签预检、响应体超限显式报错、WebDAV 禁跟随重定向等。
完整审计报告见仓库内 AUDIT_REPORT_v3.5.5.md(审计对象为 v3.5.5 基线,修复随 v3.5.6 发布)。
兼容性与升级注意事项
- 新增文件夹、角色存储策略、上传任务及认证相关模型/字段,启动时自动迁移;升级前建议保留数据库备份。
- 没有角色自定义分配时保持原有存储行为,不自动更改账号额外授权,也不会自动开启游客模式;显式保存空选择不会自动退回默认存储。
- 单存储模式的多选表示允许用户选择其中一个上传;多存储模式保留本机主副本并使用远端同步目标。
- 收回存储权限会影响未完成上传任务的后续处理;已发布图片不会因为修改角色分配而被迁移或删除。
- 身份验证及游客恢复机制有所调整,旧会话可能需要重新登录;旧游客指纹不能作为认领图片的凭据。
- 新安装未指定管理员密码时,会生成随机初始密码文件
data/.initial_admin_password;已有账号密码不重置。 - Docker 构建使用 Node 22、pnpm 10.17.1、Go 1.26 和 Alpine 3.23。
下载与部署
| 产物 | 说明 |
|---|---|
oneImg_Win_amd64_v3.5.6.zip | Windows amd64(含 README,UPX -9) |
oneImg_Linux_amd64_v3.5.6.tar.gz | Linux amd64 静态二进制(UPX -9) |
oneImg_Linux_arm64_v3.5.6.tar.gz | Linux arm64 静态二进制(UPX -9) |
oneImg_Docker_amd64_v3.5.6.tar | Docker 镜像,docker load 导入后标签 oneimg:v3.5.6-amd64 |
oneImg_Docker_arm64_v3.5.6.tar | Docker 镜像,docker load 导入后标签 oneimg:v3.5.6-arm64 |
- 全部二进制为静态链接(webp / sqlite3 由 cgo 内嵌编译),无运行时依赖,UPX -9 压缩后约 16-17MB。
- Docker 镜像 runtime 层与官方 Dockerfile 一致(alpine:3.23 + ca-certificates + tzdata)。
- 部署提醒:
.env中DEFAULT_PASS务必修改或留空(留空时首启生成随机密码写入data/.initial_admin_password);APP_URL需设为实际访问地址。
项目地址
项目地址: