应使用 php 的 finfo 扩展读取文件头魔数识别真实视频类型,如 video/mp4、video/avi 等,并结合白名单校验;上传时须用 $_files'file' 路径检测,禁止依赖扩展名或先移动后验证。

PHP判断视频文件类型,不能只依赖文件扩展名,因为容易被伪造。核心方法是读取文件头(即“魔数”),结合 finfo 扩展(基于 libmagic)进行准确识别。
使用 finfo 检测 MIME 类型(推荐)
finfo 是 PHP 内置的文件信息检测模块,能根据二进制内容判断真实类型,对视频文件支持良好。
- 确保 PHP 启用了
fileinfo扩展(php.ini 中取消;extension=fileinfo的注释) - 用
FILEINFO_MIME_TYPE获取标准 MIME 类型,如video/mp4、video/avi - 示例代码:
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mimeType = finfo_file($finfo, '/path/to/video.mp4');
finfo_close($finfo);
if (str_starts_with($mimeType, 'video/')) {
echo "这是一个视频文件,类型为:{$mimeType}";
}
检查常见视频 MIME 类型
仅判断是否为视频,可预定义合法类型列表,提高可维护性:
-
video/mp4(MP4/H.264) -
video/avi、video/x-msvideo(AVI) -
video/mkv(Matroska) -
video/webm(WebM) -
video/mov、video/quicktime(QuickTime) -
video/x-flv(FLV)
建议用 in_array($mimeType, $allowedVideoTypes) 做白名单校验,而非黑名单。
补充:验证文件头(魔数)增强可靠性
对上传场景,可额外读取前几个字节比对魔数,作为双重保障(例如 MP4 文件通常以 0x00 0x00 0x00 0x18 0x66 0x74 0x79 0x70 开头):
- 用
fopen()+fread($fp, 12)读取头部 - 用
bin2hex()转为十六进制字符串后匹配 - 注意:不同封装格式魔数差异大,需按需支持(如 AVI 固定为
52494646????41564920)
该方式适合高安全要求场景,但 finfo 已覆盖绝大多数情况,不建议单独使用。
注意上传文件的临时路径与权限
处理 $_FILES 上传时,务必使用 $_FILES['file']['tmp_name'] 路径传给 finfo,而非客户端提交的原始文件名或扩展名。
- 不要用
pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION)判断类型 - 避免直接
move_uploaded_file()后再检测——应先验再存 - 确保 web 服务器有读取临时文件的权限
不复杂但容易忽略。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











