finfo_open可绕过文件扩展名,通过读取文件头识别真实mime类型;需先初始化资源,再用finfo_file或finfo_buffer检测,配合空文件校验、流式检测及magic库版本检查,并及时关闭资源释放内存。

当用户上传一个把.jpg改成.zip的文件时,仅靠后缀名判断类型会出错,finfo_open能绕过扩展名,直接读取文件头特征识别真实类型。
初始化finfo资源
调用finfo_open函数并传入FILEINFO_MIME_TYPE常量,获取用于检测MIME类型的资源句柄。
这一步必须执行,后续所有检测都依赖这个资源对象,不初始化就调用finfo_file会返回false。
读取文件真实MIME类型
使用finfo_file函数,传入上一步创建的finfo资源和待检测的文件路径,返回类似“image/jpeg”或“application/zip”的字符串。
注意:路径必须是服务器本地可读的绝对路径或相对路径,不能是URL或未上传到服务器的客户端路径。
处理常见伪装场景
方法一:检测前先检查文件是否为空或小于128字节
小文件可能无法提取足够魔数,finfo_file会返回text/plain或空字符串,此时应拒绝上传或追加额外校验。
方法二:对上传文件流直接检测
用finfo_buffer替代finfo_file,把$_FILES['file']['tmp_name']内容读入内存后传入,避免临时文件被篡改或删除:
$content = file_get_contents($_FILES['file']['tmp_name']);
$mime = finfo_buffer($finfo, $content);
方法三:组合校验增强可靠性
【必须同时验证magic数据库版本不低于537】,旧版本无法识别WebP、AVIF等新型格式头部,会导致误判为application/octet-stream。
关闭资源释放内存
第一步:调用finfo_close($finfo)
第二步:将$finfo变量设为null
第三步:确保脚本结束前完成释放,否则可能在高并发下触发系统资源耗尽警告。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











