应同时校验文件扩展名和真实mime类型:用pathinfo()获取扩展名(如“jpg”或“jpeg”),再用finfo_file()检测实际类型(如“image/jpeg”),仅当二者匹配且为合法组合时才允许上传,防止伪装攻击。

需要在PHP中准确识别.jpg和.jpeg这类视觉上几乎相同但后缀不同的文件类型,避免仅靠扩展名判断导致上传校验失败或安全漏洞。
用pathinfo()提取原始扩展名
调用pathinfo($filename, PATHINFO_EXTENSION)获取文件名末尾的扩展名字符串。
这一步返回的是纯文本,比如“photo.jpeg”返回“jpeg”,“scan.jpg”返回“jpg”,不进行任何格式标准化处理。
注意:如果文件名含多个点(如“archive.tar.gz”),pathinfo默认只取最后一个点后的部分,【这正是你需要的行为】,无需额外截断逻辑。
用finfo_open()检测真实MIME类型
方法一:基于文件内容识别
先用fopen()打开文件句柄 → 传入finfo_open(FILEINFO_MIME_TYPE)创建资源 → 调用finfo_file()获取实际MIME类型 → 关闭finfo资源和文件句柄。
返回结果类似“image/jpeg”,与扩展名无关。哪怕把.jpg文件重命名为.txt,只要内容是JPEG编码,这里仍返回image/jpeg。
方法二:一行快捷写法(适合临时校验)
直接使用finfo_file(finfo_open(FILEINFO_MIME_TYPE), $filepath),但要注意该写法未显式关闭资源,高并发场景下可能触发系统资源限制。
组合判断实现精准区分
第一步:用pathinfo取得扩展名,存入变量$ext。
第二步:用finfo检测真实类型,存入变量$mime。
第三步:写条件分支——若$ext === 'jpg' && $mime === 'image/jpeg',视为合法jpg;若$ext === 'jpeg' && $mime === 'image/jpeg',视为合法jpeg;其余情况统一拒绝。
这种双重校验能防止用户上传伪装成.jpg的PHP木马(如将.php文件改名为shell.jpg),因为finfo会识破其真实类型为text/x-php。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











