0

0

php怎样处理上传文件类型错误_php处理上传文件类型错误方法【技巧】

看不見的法師

看不見的法師

发布时间:2026-02-24 19:30:01

|

131人浏览过

|

来源于php中文网

原创

$_files'file'不可信,因其由浏览器伪造而非php检测;应使用finfo_open()基于文件内容识别mime类型,并辅以getimagesize()、文件头校验、重命名、目录权限控制等多重防护。

php怎样处理上传文件类型错误_php处理上传文件类型错误方法【技巧】

为什么 $_FILES['file']['type'] 不可信?

浏览器自己填的 $_FILES['file']['type'],不是 PHP 检查出来的——它只是 HTTP 请求里带过来的 Content-Type 字段,用户改个浏览器开发者工具就能伪造。靠它判断文件类型,等于用门牌号当锁芯。

真正该做的是:忽略这个字段,改用服务端真实检测。

  • finfo_open() 做 MIME 类型探测(推荐)
  • 对图片类文件,可加 getimagesize() 二次验证
  • 对 ZIP/PDF 等格式,检查文件头(magic bytes)更稳妥

怎么用 finfo_open() 安全判断上传文件类型?

finfo_open() 是 PHP 内置函数,基于 libmagic 库,读取文件实际内容来识别类型,比扩展名和 $_FILES['file']['type'] 可靠得多。

实操建议:

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

梯子AI
梯子AI

百度推出的AI智能搜索

下载
  • 必须传入 FILEINFO_MIME_TYPE,不要只用 FILEINFO_MIME(后者会带编码,难匹配)
  • 检测前先确认 $_FILES['file']['error'] === UPLOAD_ERR_OK,否则 tmp_name 可能为空
  • finfo_file() 传入临时文件路径,别尝试读整个文件内容再检测
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mimeType = finfo_file($finfo, $_FILES['file']['tmp_name']);
finfo_close($finfo);

if (!in_array($mimeType, ['image/jpeg', 'image/png', 'image/gif'])) {
    die('不支持的文件类型');
}

只校验 MIME 类型还不够?这些边界情况要手动堵住

哪怕 finfo_file() 返回 image/jpeg,也不能直接当成安全图片——攻击者可能把恶意代码塞进 JPEG 的 EXIF 段,或构造畸形文件绕过检测。

关键补漏点:

  • 对图片上传,额外调用 getimagesize($_FILES['file']['tmp_name']);返回 false 就说明不是合法图像
  • 限制上传文件大小(upload_max_filesize$_FILES['file']['size'] 双重检查)
  • 绝不信任原始 $_FILES['file']['name'],重命名时强制指定后缀(如 uniqid() . '.jpg'),并去掉所有路径字符(basename() 过滤)
  • 上传目录禁止执行权限,且不要放在 Web 根目录下(例如放到 /var/uploads/ 而非 ./uploads/

常见报错:Undefined index: fileUPLOAD_ERR_NO_FILE

这两个错误根本不是类型问题,而是表单或传输环节出错,但新手常误以为是 MIME 判断逻辑错了。

排查顺序:

  • 确认 HTML 表单有 enctype="multipart/form-data"
  • 确认 <input type="file">name 属性和 PHP 中 $_FILES 键名完全一致(区分大小写)
  • 检查是否设置了 max_file_uploadspost_max_size 过小,导致文件被截断
  • UPLOAD_ERR_NO_FILE 多半是用户没选文件就提交,不是后端逻辑问题
PHP 文件类型校验真正麻烦的从来不是“怎么写判断”,而是“怎么让判断不被绕过”。每多一层验证(MIME + 图像解析 + 后缀重写 + 目录隔离),就少一个可能被利用的缝隙。没人会告诉你,最危险的文件往往看起来最无害。

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

391

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

348

2023.10.25

undefined是什么
undefined是什么

undefined是代表一个值或变量不存在或未定义的状态。它可以作为默认值来判断一个变量是否已经被赋值,也可以用于设置默认参数值。尽管在不同的编程语言中,undefined可能具有不同的含义和用法,但理解undefined的概念可以帮助我们更好地理解和编写程序。本专题为大家提供undefined相关的各种文章、以及下载和课程。

5819

2023.07.31

网页undefined是什么意思
网页undefined是什么意思

网页undefined是指页面出现了未知错误的意思,提示undefined一般是在开发网站的时候定义不正确或是转换不正确,或是找不到定义才会提示undefined未定义这个错误。想了解更多的相关内容,可以阅读本专题下面的文章。

3259

2024.08.14

网页undefined啥意思
网页undefined啥意思

本专题整合了undefined相关内容,阅读下面的文章了解更多详细内容。后续继续更新。

1405

2025.12.25

点击input框没有光标怎么办
点击input框没有光标怎么办

点击input框没有光标的解决办法:1、确认输入框焦点;2、清除浏览器缓存;3、更新浏览器;4、使用JavaScript;5、检查硬件设备;6、检查输入框属性;7、调试JavaScript代码;8、检查页面其他元素;9、考虑浏览器兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

195

2023.11.24

http500解决方法
http500解决方法

http500解决方法有检查服务器日志、检查代码错误、检查服务器配置、检查文件和目录权限、检查资源不足、更新软件版本、重启服务器或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

474

2023.11.09

http请求415错误怎么解决
http请求415错误怎么解决

解决方法:1、检查请求头中的Content-Type;2、检查请求体中的数据格式;3、使用适当的编码格式;4、使用适当的请求方法;5、检查服务器端的支持情况。更多http请求415错误怎么解决的相关内容,可以阅读下面的文章。

445

2023.11.14

Golang 生态工具与框架:扩展开发能力
Golang 生态工具与框架:扩展开发能力

《Golang 生态工具与框架》系统梳理 Go 语言在实际工程中的主流工具链与框架选型思路,涵盖 Web 框架、RPC 通信、依赖管理、测试工具、代码生成与项目结构设计等内容。通过真实项目场景解析不同工具的适用边界与组合方式,帮助开发者构建高效、可维护的 Go 工程体系,并提升团队协作与交付效率。

1

2026.02.24

热门下载

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

精品课程

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

共137课时 | 12.4万人学习

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

共6课时 | 11.3万人学习

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

共13课时 | 0.9万人学习

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

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