0

0

PHP如何验证视频文件完整性_PHP验证视频完整性校验【校验】

絕刀狂花

絕刀狂花

发布时间:2026-01-19 19:52:42

|

201人浏览过

|

来源于php中文网

原创

必须用 finfo_file() 校验真实 MIME 类型而非扩展名或 $_FILES['type'],再用 ffprobe 验证视频结构完整性,最后结合文件存在性、大小、上传状态检查,三层校验缺一不可。

php如何验证视频文件完整性_php验证视频完整性校验【校验】

finfo_file() 检查视频 MIME 类型是否匹配扩展名

仅靠文件后缀(如 .mp4)完全不可信,攻击者可把恶意文件重命名为 evil.jpg 上传。PHP 的 finfo_file() 能读取文件真实二进制头信息,判断是否为合法视频。

常见错误是直接用 $_FILES['video']['type'] —— 这个值由浏览器提供,极易伪造,必须丢弃。

  • finfo_open(FILEINFO_MIME_TYPE) 返回类似 video/mp4video/quicktime 的 MIME,需白名单校验
  • 注意:某些 MOV 文件可能返回 video/quicktime,而 FFmpeg 常识别为 video/mp4,别硬写死 === 'video/mp4'
  • 对 Web 兼容性要求高的场景,建议允许:video/mp4video/webmvideo/quicktime(对应 MOV)、video/x-ms-wmv(极少但存在)
if (!isset($_FILES['video']) || $_FILES['video']['error'] !== UPLOAD_ERR_OK) {
    die('上传失败');
}
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mimeType = finfo_file($finfo, $_FILES['video']['tmp_name']);
finfo_close($finfo);

$allowedTypes = ['video/mp4', 'video/webm', 'video/quicktime', 'video/x-ms-wmv'];
if (!in_array($mimeType, $allowedTypes)) {
    die('不支持的视频格式');
}

get_headers()file_exists() 验证临时文件未被篡改

上传完成后,PHP 把文件暂存到系统临时目录(如 /tmp/phpXXXXXX),但这个路径可能被其他进程或符号链接攻击干扰。必须确认该文件真实存在、可读、且大小合理。

容易忽略的是:上传超时或中断会导致 $_FILES['video']['tmp_name'] 指向一个空文件或已删除路径,直接调用 move_uploaded_file() 可能静默失败。

立即学习PHP免费学习笔记(深入)”;

  • 先用 is_uploaded_file($_FILES['video']['tmp_name']) 确认是 PHP 本次上传生成的临时文件(防路径遍历)
  • 再用 filesize($_FILES['video']['tmp_name']) 判断是否为 0 —— 视频文件几乎不可能为 0 字节
  • 设置合理上限,例如 (500MB),避免 DoS 攻击;注意 upload_max_filesizepost_max_size php.ini 配置需同步调整

ffprobe 检查视频元数据与流结构(真正校验完整性)

finfo_file() 只能看文件头,无法发现损坏的帧、断裂的索引(moov box 位置异常)、或伪视频(如 JPEG 数据拼接在 MP4 容器里)。要真正验证「能播放」,必须调用 FFmpeg 工具链。

文心快码
文心快码

文心快码(Comate)是百度推出的一款AI辅助编程工具

下载

关键点:不要用 exec('ffmpeg -i ...') 捕获输出,FFmpeg 错误信息常写入 STDERR,PHP 默认不捕获;且需防止 shell 注入。

  • escapeshellarg() 包裹临时文件路径,例如:escapeshellarg($_FILES['video']['tmp_name'])
  • 执行 ffprobe -v quiet -show_entries format=duration:stream=codec_type,width,height -of default=nw=1,检查是否输出 codec_type=video 且有有效 width/height
  • 若返回空或报错(如 No such file or directoryInvalid data found when processing input),说明文件损坏或非标准视频
  • 注意性能:ffprobe 对大文件会读取部分数据,但比完整转码快得多;生产环境建议加超时(如 timeout 10s ffprobe ...

为什么不能只依赖 md5_file()hash_file()

哈希值只能验证「文件内容未被修改」,不能验证「它是不是一个有效的视频」。一个被截断的 MP4、头部损坏的 AVI、甚至纯文本文件,只要内容固定,哈希就稳定不变。

更危险的是:如果业务逻辑把哈希作为「视频可用」的依据(比如前端上传后立即展示预览),用户可能上传一个哈希正确但根本无法解码的文件,导致播放器崩溃或服务端解析失败。

  • hash_file('sha256', $path) 适合做去重或传输校验,不是格式校验
  • 若需双重保障,应先通过 finfo + ffprobe 验证有效性,再计算哈希存库用于后续比对
  • 特别注意:某些云存储(如 AWS S3)上传分片后合并,可能产生合法哈希但非法结构的文件 —— 校验必须在合并后、入库前完成

真正难的不是调哪个函数,而是分清「文件存在」「文件可信」「文件可播」三层校验,漏掉任何一层,都可能让损坏视频进入你的 CDN 或数据库。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2684

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1661

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1519

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

952

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1419

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1235

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1488

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1306

2023.11.13

PS使用蒙版相关教程
PS使用蒙版相关教程

本专题整合了ps使用蒙版相关教程,阅读专题下面的文章了解更多详细内容。

23

2026.01.19

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 8.9万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 8.4万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号