0

0

PHP怎样判断文件是否为音频_PHP音频文件识别法【类型】

蓮花仙者

蓮花仙者

发布时间:2026-02-07 12:06:09

|

448人浏览过

|

来源于php中文网

原创

最可靠方式是用 finfo_file() 基于二进制头识别音频 MIME 类型,因其依赖 libmagic 解析内容而非扩展名或浏览器伪造的 type 字段;处理内存数据时应改用 finfo_buffer()。

php怎样判断文件是否为音频_php音频文件识别法【类型】

finfo_file() 判断音频 MIME 类型最可靠

仅靠文件扩展名(如 .mp3)判断音频类型极易被绕过,真实场景中必须检查文件内容。PHP 的 finfo_file() 基于 libmagic,能解析二进制头信息,是识别音频类型的首选方式。

常见错误是直接用 mime_content_type() —— 它已被弃用,且在某些 PHP 版本中不可用;还有人用 getimagesize() 试图“碰运气”,但它只支持图片,对音频返回 false 或警告。

正确做法:

  • 始终使用 finfo_open(FILEINFO_MIME_TYPE) 初始化资源
  • 调用 finfo_file() 传入文件路径,不依赖 $_FILES 临时路径以外的变量
  • 检查返回值是否为已知音频 MIME 类型,例如 "audio/mpeg""audio/wav""audio/ogg""audio/flac"
  • 注意:部分 Web 服务器会把 .m4a 识别为 "audio/mp4""video/mp4",需一并接受

为什么 pathinfo($file, PATHINFO_EXTENSION) 不足以判定音频

扩展名只是字符串,可被任意修改。攻击者上传伪造后缀的恶意脚本(如 shell.mp3 实际是 PHP 文件),仅校验扩展名会完全失效。

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

典型误用场景:

  • in_array(pathinfo($file, PATHINFO_EXTENSION), ['mp3', 'wav', 'ogg']) 放行文件
  • 未配合 MIME 检查就直接 move_uploaded_file()
  • $_FILES['audio']['type'] 当作可信来源(浏览器可随意伪造该字段)

扩展名只能作为辅助提示,不能参与安全决策。

WOMBO
WOMBO

使用AI创作美丽的艺术品

下载

处理流式上传或内存数据时如何识别音频

当音频来自 cURL 响应、S3 流或 base64 解码后的二进制内容时,finfo_file() 无法直接使用(它需要文件路径)。此时必须用 finfo_buffer()

关键点:

  • 确保传入的是原始二进制字节(不是字符串或已解码的 UTF-8 文本)
  • 若数据来自 file_get_contents()curl_exec(),默认就是二进制,可直接传入
  • 若来自 base64_decode(),确认未被自动转义或截断(特别是含 null 字节时)
  • 示例:$finfo = finfo_open(FILEINFO_MIME_TYPE); $mime = finfo_buffer($finfo, $raw_data);

常见音频 MIME 类型及兼容性注意点

不同系统、PHP 版本、libmagic 数据库版本可能导致识别结果略有差异。实际部署前务必在目标环境中验证。

主流音频类型对应关系(以较新 libmagic 为准):

  • "audio/mpeg" → MP3、MP3pro
  • "audio/wav" → PCM WAV(注意:某些带编码的 WAV 可能返回 "audio/x-wav"
  • "audio/ogg" → Vorbis、Opus(但部分 Opus 文件可能返回 "application/ogg"
  • "audio/flac" → FLAC(无损)
  • "audio/mp4""video/mp4" → M4A、AAC(取决于封装方式)

别硬编码 strict 相等判断,建议用 str_starts_with($mime, 'audio/') + 白名单二次过滤,避免因小版本差异导致合法文件被拒。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

241

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

601

2024.03.01

curl_exec
curl_exec

curl_exec函数是PHP cURL函数列表中的一种,它的功能是执行一个cURL会话。给大家总结了一下php curl_exec函数的一些用法实例,这个函数应该在初始化一个cURL会话并且全部的选项都被设置后被调用。他的返回值成功时返回TRUE, 或者在失败时返回FALSE。

447

2023.06.14

linux常见下载安装工具
linux常见下载安装工具

linux常见下载安装工具有APT、YUM、DNF、Snapcraft、Flatpak、AppImage、Wget、Curl等。想了解更多linux常见下载安装工具相关内容,可以阅读本专题下面的文章。

179

2023.10.30

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

403

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

213

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1514

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

633

2023.11.24

Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

2

2026.02.06

热门下载

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

精品课程

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

共137课时 | 11.2万人学习

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

共6课时 | 11.2万人学习

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

共13课时 | 0.9万人学习

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

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