媒体库 · 相册式附件管理 1.5.1 审核意见
审核结果
当前版本不建议上架,请修改后重新提交审核。
本次发现 4 个必须修改的问题,其中“越权读取附件”和“对象存储兼容问题”会影响用户数据安全或主要功能,属于阻断上架的问题。
审核信息
- 插件 ID:
at8_media_library - 插件版本:
1.5.1 - 审核日期:2026-09-21
- 参考环境:Z-BlogPHP 1.7.5.3540 Optimus
- 对象存储兼容性参考插件:
fui_oss
必须修改的问题
1. 插件兼容版本填写不正确
plugin.xml 中的 <adapted> 填写了 1.7.0,但这里应该填写 Z-BlogPHP 的内部版本号。如果最低支持版本是 1.7.0,应填写 172900。
插件还没有填写最低 PHP 版本,可能导致用户在不兼容的 PHP 环境中安装并启用插件,严重时会使网站直接报错。
另外,dependency、rewritefunctions、existsfunctions、conflict 等字段应放在 <advanced> 节点内,否则 Z-Blog 无法正确读取。
审核意见:
- 正确填写 Z-BlogPHP 内部版本号;
- 根据实际测试结果填写最低 PHP 版本;
- 调整
<advanced> 内的字段结构; - 修改后实际验证安装和启用时的兼容性检查是否生效。
2. 普通附件管理员可以查看其他用户的附件
插件只检查用户是否拥有附件管理权限,没有继续判断用户是否拥有“管理全部附件”的权限。
因此,一个只能管理自己附件的后台账号,也可以通过插件查看其他用户上传的附件,包括:
- 文件名、附件地址、文件类型和大小;
- 上传者、上传时间和关联文章;
- 全站附件数量、容量及分类统计;
- 其他用户附件的引用情况。
这与 Z-Blog 官方附件管理的权限规则不一致,属于越权读取。
审核意见:
- 拥有
UploadAll 权限的用户可以查看全部附件; - 没有
UploadAll 权限的用户只能查看自己的附件; - 这个限制必须同时用于列表、统计、筛选、引用检查和文章编辑页附件面板;
- 不能依靠前端传入的上传者 ID 控制权限,必须在服务端强制限制。
3. 对象存储附件会被误报为丢失,替换文件也不能正确同步
插件获取附件地址时使用了 Z-Blog 官方的 $upload->Url,因此复制 URL、新窗口打开和文章编辑页插入附件,能够兼容 fui_oss 的云端地址和代理地址。
但是,插件判断附件是否存在时,只检查服务器本地文件。
当 fui_oss 已经把文件上传到对象存储,并按设置删除本地文件后,远端文件仍然可以正常访问,但媒体库会把它显示为“文件缺失”,并出现以下问题:
- 图片列表不显示云端缩略图;
- 图片、视频和音频不能在详情中预览;
- 图片宽高显示为 0;
- 同一个附件可以复制和打开 URL,却又被插件提示为文件缺失。
替换附件时,插件直接覆盖本地文件,没有经过 Z-Blog 官方附件保存流程:
- 本地文件已被删除时,附件完全无法替换;
- 保留本地文件时,只会替换本地文件,不会更新对象存储中的文件;
- 数据库可能已经显示新的大小和类型,但用户访问到的仍是云端旧文件。
新上传已经调用官方 SaveFile()。对于当前版本的 fui_oss,文件会先保存到本地,再在请求结束时上传到对象存储,因此新上传通常可以完成。但插件仍然把“本地文件存在”当作上传成功的必要条件,无法兼容完全不保存本地文件的其他存储插件。
审核意见:
- 不要再用本地文件是否存在判断对象存储附件是否丢失;
- 缩略图和图片、视频、音频预览应直接使用官方附件 URL;
- 替换附件必须经过能够触发对象存储 Hook 的官方流程;
- 如果暂时无法安全替换对象存储附件,应明确禁止该操作,不能只修改本地文件和数据库;
- 至少测试
fui_oss 的直接地址、代理地址、保留本地文件和删除本地文件四种组合。
4. 上传和删除没有完整使用 Z-Blog 官方权限及处理流程
插件把上传、删除等写操作都绑定到了 UploadAll,没有分别使用 Z-Blog 的上传权限 UploadPst 和删除权限 UploadDel。
这会造成两类问题:
- 某些自定义角色本来可以上传或删除自己的附件,却被插件错误拒绝;
- 权限插件对
UploadPst、UploadDel 的单独设置可能失效。
插件保存或删除附件后,也没有完整执行 Z-Blog 官方流程,例如:
- 没有正确更新用户的附件数量;
- 没有触发官方上传成功 Hook;
- 删除文件失败时,仍可能删除数据库记录并向前端返回成功;
- 依赖官方 Hook 的缩略图、同步、日志或审计插件可能无法正常工作。
审核意见:
- 上传使用
UploadPst,删除使用 UploadDel; UploadAll 只用于判断用户能否操作其他人的附件;- 上传和删除应优先复用 Z-Blog 官方业务流程;
- 正确更新附件缓存和用户附件数量,并触发官方 Hook;
- 只有文件、对象存储和数据库都处理成功后,才能向前端返回成功;
- 批量删除需要分别返回成功、失败和跳过的数量。
重新提交时重点检查
plugin.xml 中的 Z-BlogPHP 和 PHP 兼容版本是否填写正确;- 没有
UploadAll 权限的账号是否只能看到自己的附件; fui_oss 删除本地文件后,云端图片、视频和音频能否正常显示和预览;- 替换对象存储附件后,远端内容和数据库信息是否一致;
- 不同的
UploadPst、UploadDel、UploadAll 权限组合是否按预期工作; - 上传和删除后,用户附件数量、官方 Hook、文件及数据库状态是否一致。
其他检查结果
以下项目没有发现需要阻止上架的重大问题:
- 插件自定义 PHP 函数均使用了
at8_media_library 前缀; - 没有发现函数重名或明显的全局命名冲突;
- 重复使用
require_once 不会重复加载函数文件或重复注册 Hook; - 没有发现插件功能挂载到网站前台高频 Hook,正常前台访问不会执行附件统计或远程请求;
- 标准附件 URL 和标准附件删除入口使用了 Z-Blog 官方接口;
- 没有发现明显的 SQL 注入、目录穿越、未登录写入、任意文件覆盖或存储型 XSS;
- PHP、XML 和 JavaScript 语法检查均已通过。
最后于 28天前
被沉冰浮水编辑
,原因: