攻击者把脚本改名成图片后缀并伪造类型,成功上传后被解析执行。乍看像缓存或者权限的锅,追下去往往不是。

finfo_file(finfo_open(FILEINFO_MIME_TYPE), $tmp)
# 只允许 image/jpeg image/png image/webp

追下去是这么回事:校验只依赖请求头声明与扩展名,没有检查真实文件内容。

「上传类型校验」这类改动最怕改一半,回滚脚本先准备好,再动生产。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。

能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。报错里带路径的,先去看那个路径在不在、权限对不对。

同一份配置存在多处的,先确认改的是被加载的那一份。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。

备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。

具体做法是,读取文件头判断真实类型;限制可上传类型白名单;重命名保存并禁止执行。

验收就看一点,伪造类型的文件被拒绝,正常图片可上传。

作者 9823189