安全加固
安全加固(自托管)
面向运维:私有图、反代、对象存储、机审旁路。仓库完整清单见 docs/security-hardening.md 与 SECURITY.md。
威胁模型(短)
| 资产 | 典型风险 |
|---|---|
公开图 key(/i/{key}) | 枚举困难(随机 key)但不是秘密能力;盗链烧带宽 |
| 私有图 | 应用校验属主;对象存储不得匿名可读 |
| 待审 / 拒审 / max_views 耗尽 | 非属主应得 404/占位,勿暴露原对象 |
| URL 抓取上传 | SSRF:默认拒内网;fetch_allow 过宽会出事 |
| 管理会话 / SMTP / 机审密钥 / HTML 注入插槽 | 会话或 DB 失陷;HTML 注入可整站 XSS |
对象存储(必做)
- 关闭匿名
GetObject、ListBucket。 - 不要让公开 CDN 在无签名情况下提供
private/*。 - 优先独立桶或 IAM:仅 imgli 进程可读私有键。
- 日志/Issue 勿粘贴完整私有预签名 URL。
应用层已有纵深:
- 对象键
public/vsprivate/前缀 - CDN 302 从不给
private/键拼公开 CDN URL(CDNEligibleObjectKey) - 私有:短 TTL 预签名或经应用流式输出
- 默认 strip EXIF/GPS(后台可关)
- 可选 热链白名单 + 空 Referer 策略
应用门禁必要但不充分——桶世界可读时仍会泄露。
探测
期望非 2xx。
Checklist
-
桶私有;
private/无公共 ACL -
无开放
ListBucket - CDN 仅卸公开流量(或签名 CDN)
-
CDN 源站不能匿名吐
private/* - 部署后跑 probe 脚本
- 预签名 TTL 保持短;不缓存签名 URL
- DB + 对象备份均有访问控制
-
trust_proxy仅可信反代 -
fetch_allow保持最小 - 公网站点评估热链;HTML 注入仅管理员且慎用
-
imgli doctor无 FAIL
反代
- TLS 终止在反代
IMGLI_BASE_URL设为用户浏览器打开的 https 公网源(同时用于外链与浏览器写请求 CSRF Origin 白名单)IMGLI_TRUST_PROXY=true仅当反代可信(限速与审计 IP 依赖)- 反代后登录/注册 403「跨站请求被拒绝」:多为 BASE_URL 仍是 localhost/IP 端口;见 FAQ 与仓库 security-hardening.md
- v0.7+ 后台 系统 / 运维 可对照 doctor 与浏览器源
- OCR / NSFW 旁路:IP 白名单 + Bearer(见
deploy/ocr-paddle/) - 勿把管理端口或 debug 端点直接裸奔公网
热链、隐私与抓取
- 热链(hotlink):后台可启用;空 Referer 是否放行要权衡「Markdown 直开」与防盗。
- EXIF:默认剥离 GPS/元数据,降低位置泄露。
- URL 上传 / 抓取:默认拒绝链路本地/内网;仅在
fetch_allow显式放行。 - 站点 HTML 注入:管理员可向 head/body 注入脚本(统计等);错误或恶意标记影响整站——勿粘贴不可信 HTML。
内容安全
- fail-open vs fail-closed 是策略选择(公网 Demo 务必想清楚)
- 待审图不可被游客热链(应用门禁);对象层仍要锁死
- 生产旁路密钥与词表路径不要写进公开文档
自检:配置变更后运行 imgli doctor(含 CDN 计量 WARN),或打开管理后台 系统 / 运维。仓库长文:docs/security-hardening.md。
校对:2026-08-01(v0.7.0 · 系统/运维健康台 + 反代 CSRF)。
漏洞报告
请用 GitHub private security advisory,不要开公开 Issue。
最后更新: 2026-08-06