Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
原来只看扩展名:改个后缀什么都能落盘,再由 /public/* 按扩展名配 content-type 发出去。线上 Caddy 有 nosniff 兜着,但不该把非图片存到盘上。 - services/image.ts:按 PNG / JPEG / GIF / BMP 的文件头识别,返回落盘用的扩展名 —— 以内容为准,改名成 .png 的 JPEG 存成 .jpg,content-type 才对得上 - 头像上传、后台插图上传都走它;插图那边扩展名白名单保留当第一道快速筛 - serveUpload 自己也带 x-content-type-options: nosniff,不只靠 Caddy 实跑核过:真 PNG / GIF 正常;改名成 .png 的 JPEG 存成 .jpg;改名成 .png 的 HTML 两个入口都拒;/public/upload 回 image/png + nosniff。 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>