0

0

PHP如何判断文件是否为文本_PHP文本文件检测法【类型】

星夢妙者

星夢妙者

发布时间:2026-02-09 10:37:02

|

524人浏览过

|

来源于php中文网

原创

finfo_file() 是最可靠的 MIME 类型检测方式,应使用 FILEINFO_MIME_TYPE 标志并指定系统 magic 路径;空文件需单独判断;需结合 mb_detect_encoding() 和 mb_check_encoding() 验证编码有效性;不可依赖扩展名或 is_readable();生产环境须分层过滤、宁可误杀。

php如何判断文件是否为文本_php文本文件检测法【类型】

finfo_file() 检测 MIME 类型最可靠

直接读文件头比扩展名靠谱得多,finfo_file() 是 PHP 官方推荐的 MIME 探测方式,能识别 UTF-8、ISO-8859-1、UTF-16 等编码下的文本内容,也能区分 text/plaintext/html 等子类型。

实操建议:

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

OmniAudio
OmniAudio

OmniAudio 是一款通过 AI 支持将网页、Word 文档、Gmail 内容、文本片段、视频音频文件都转换为音频播客,并生成可在常见 Podcast ap

下载
  • 必须用 FILEINFO_MIME_TYPE 标志,避免用 FILEINFO_MIME(它返回带 charset 的完整字符串,解析麻烦)
  • 初始化 finfo 时指定系统 magic 文件路径更稳妥:finfo_open(FILEINFO_MIME_TYPE, '/usr/share/misc/magic'),否则可能 fallback 到内置精简库,对某些编码识别不准
  • 注意:空文件会被判为 application/octet-stream,需单独判断 filesize() === 0

mb_detect_encoding() 辅助验证是否可读文本

MIME 类型只是“声称”,真正能否当文本处理还得看字节序列是否符合常见编码规则。比如一个二进制文件可能被误标为 text/plain,但实际含大量非法 UTF-8 字节。

实操建议:

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

  • 传入常见编码数组:mb_detect_encoding($content, ['UTF-8', 'GB2312', 'BIG5', 'ISO-8859-1'], true),第三个参数 true 表示严格模式(跳过非法字节则返回 false
  • 不要只依赖返回值,要结合 mb_check_encoding($content, $encoding) 二次确认
  • 大文件慎用:需读全内容到内存,建议限制前 64KB 检测

避免用 is_readable() 或扩展名判断文本性

is_readable() 只检查权限和存在性,pathinfo($file, PATHINFO_EXTENSION) 更不可靠——report.pdf.exe 也能叫 .txt

常见错误现象:

  • 用户上传名为 payload.txt 的 WebShell,实际是 PHP 脚本,仅靠扩展名放行导致代码执行
  • JSON 文件被当成二进制(因为某些工具导出时没加换行,finfo 判为 application/json,但其实是纯文本)
  • Windows 记事本保存的 UTF-16 文件无 BOM,finfo 常误判为 application/octet-stream

生产环境建议组合判断逻辑

单一方法总有盲区,真实场景需要分层过滤:

  • 先用 finfo_file() 排除明显非文本类型(如 application/pdfimage/png
  • text/* 类型再抽样检测前 8192 字节的编码有效性(mb_check_encoding()
  • 对疑似 UTF-16/UTF-32 且无 BOM 的文件,尝试用 mb_convert_encoding($content, 'UTF-8', 'UTF-16LE') 转码并检查是否产生乱码
  • 最终仍存疑?记录日志并拒绝,而不是降级处理

文本性不是非黑即白的属性,尤其在用户可控输入场景下,BOM、混合编码、控制字符都会让边界模糊——宁可误杀,不放过一个二进制伪装体。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

433

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

543

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

315

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

79

2025.09.10

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

433

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

543

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

315

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

79

2025.09.10

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

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

98

2026.02.06

热门下载

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

精品课程

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

共137课时 | 11.3万人学习

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号