From 872baf4153081af52e2768c08af878687d88fced Mon Sep 17 00:00:00 2001 From: laoyang Date: Tue, 3 Nov 2026 08:19:17 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=EF=BC=9A=E5=9B=BE=E6=A0=87?= =?UTF-8?q?=E5=AD=98=E5=82=A8=E6=9C=AA=E8=B7=9F=E9=9A=8F=E5=90=8E=E5=8F=B0?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=EF=BC=8C=E6=9C=AC=E5=9C=B0=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?=E4=B8=8B=E5=9B=BE=E6=A0=87=E6=98=BE=E7=A4=BA=E4=B8=8D=E5=87=BA?= =?UTF-8?q?=E6=9D=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 用户指出图标应当与附件同一套逻辑:管理员在后台配 local 就存本机、 配 oss 就存 OSS,前台都一样走 media.php 代理。 原实现把图标键硬编码成 icons/…(不带存储前缀),导致: - fb_attach_is_local() 恒为 false - 本机模式下文件确实写进了 uploads/icons/, 但 media.php 把它当 OSS 对象去读 → 503,图标完全显示不出来 修法:图标键与附件完全同规则,只是路径里多一段 icons/ local 模式 → local/icons/YYYY/MM/. 落 uploads/icons/ oss 模式 → /icons/YYYY/MM/. 落私有桶 前台地址两种模式一致(media.php?k=…),换存储方式旧图标不会失效。 同时: - fb_icon_is_key/ok 改为同时识别两种前缀 - fb_icon_allowed_ext 移到 attach.php(media.php 与校验都会用, 不能依赖 admin_taxonomy.php 被加载) - 写入时加断言:键前缀必须与当前存储模式一致,脱钩就报错, 不再静默存到错误位置 验证(线上真实环境,两种模式各跑一遍): - local:键带 local/icons/ 前缀、写入 uploads/icons/ 成功、 media.php 读回 200 image/png 501B、PNG 魔数正确、删除后 404 - oss:键带 fb/icons/ 前缀、is_local=false、URL 拼接正确 - 旧 bug 形态(icons/… 无前缀)现在被明确拒绝 400,不再误判成 OSS - 测试后配置已复原为 oss,临时文件与诊断入口全部清理 --- lib/admin_taxonomy.php | 18 ++++++++---- lib/attach.php | 64 +++++++++++++++++++++++++++++++----------- lib/bootstrap.php | 2 +- 3 files changed, 61 insertions(+), 23 deletions(-) diff --git a/lib/admin_taxonomy.php b/lib/admin_taxonomy.php index 8aed2c1..9fa9a5c 100644 --- a/lib/admin_taxonomy.php +++ b/lib/admin_taxonomy.php @@ -19,12 +19,8 @@ if (!defined('FB_ROOT')) { http_response_code(403); exit('forbidden'); } * 对外一律 media.php?k=... 代理,不暴露真实位置。 * ================================================================== */ -/** 图标允许的扩展名(比附件白名单窄:图标不需要 gif 动图,也不要 svg) */ -function fb_icon_allowed_ext() { - // ⚠️ 刻意不收 svg:SVG 能内嵌