0

0

php实现班级通信录导入限制文件类型_php校验后缀导入法【技巧】

絕刀狂花

絕刀狂花

发布时间:2026-02-08 12:06:04

|

350人浏览过

|

来源于php中文网

原创

最稳方案是:先筛后缀,再读文件头校验magic bytes,用finfo检查MIME类型,保存为随机名且路径禁脚本执行,PhpSpreadsheet设setReadDataOnly(true)和限定工作表,流式读取,PDO预处理+事务写库。

php实现班级通信录导入限制文件类型_php校验后缀导入法【技巧】

只允许上传 .xlsx.xls 文件,PHP 怎么做最稳?

前端 `` 或 JS 检查后缀纯属摆设,必须在 PHP 层硬校验。关键不是看文件名后缀,而是读取文件头(magic bytes)+ 解析实际内容结构。

  • 先用 pathinfo($filename, PATHINFO_EXTENSION) 快速筛掉明显不对的后缀(如 .php.exe),但不能仅依赖它
  • 再用 fopen() 读取前 16 字节,比对 Excel 文件特征:\xD0\xCF\x11\xE0(.xls)或 PK\x03\x04(.xlsx 的 ZIP 头)
  • 最后尝试用 PhpSpreadsheet 加载——如果抛出 PhpOffice\PhpSpreadsheet\Reader\Exception,说明不是合法 Excel,直接拒收

$_FILES['file']['name'] 后缀可被伪造,怎么防?

攻击者改个 student.php.xls 就能绕过简单 str_ends_with() 判断。真实风险在于:你用 move_uploaded_file() 存到临时目录后,仍可能被当成 PHP 执行(尤其当 web server 配置宽松时)。

  • 不要用原始文件名保存,生成随机名(如 uniqid('import_').'.xlsx'
  • 保存路径必须在 web root 外,或至少禁用该目录下所有脚本执行(Nginx 加 location ~ \.(php|sh|pl)$ { deny all; }
  • 上传后立即用 finfo_open(FILEINFO_MIME_TYPE) 检查 MIME 类型,application/vnd.ms-excelapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet 才放行

PhpSpreadsheet 导入前,为什么一定要调 setReadDataOnly(true)

不加这个,Excel 里带公式的单元格会触发计算引擎,可能执行恶意宏逻辑(虽现代版本默认禁用,但兼容性风险仍在),更严重的是:大文件加载全量对象会吃光内存。

  • $reader->setReadDataOnly(true) 确保只读数值/文本,跳过样式、公式、图表等无关字段
  • 配合 $reader->setLoadSheetsOnly(['Sheet1']) 限定工作表,避免多页签遍历开销
  • 导入循环中别用 getActiveSheet()->getCell('A'.$i)->getValue() 反复查表,改用 getRowIterator() + getCellIterator() 流式读取,内存占用直降 70%+

校验通过后,怎么安全地把数据写进数据库?

学生姓名、电话、家长邮箱这些字段看着普通,但批量插入时容易因空值、超长、SQL 注入或唯一索引冲突崩掉整个导入流程。

SciMaster
SciMaster

全球首个通用型科研AI智能体

下载

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

  • 逐行用 filter_var($phone, FILTER_SANITIZE_NUMBER_INT) 清洗手机号,用 filter_var($email, FILTER_VALIDATE_EMAIL) 校验邮箱格式
  • 用 PDO 预处理语句插入,别拼 SQL 字符串;对班级 ID 这类外键字段,先查一次 SELECT id FROM classes WHERE code = ?,查不到就跳过这行并记录错误
  • 开启事务:$pdo->beginTransaction(),全部成功才 commit(),任一失败立刻 rollback(),避免部分写入脏数据

真正难的不是读 Excel,是把“用户以为只是点一下”的操作,变成服务器上一连串不可跳过、不可妥协的防御链。漏掉任意一环,通信录就可能变成攻击入口。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

857

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

332

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

351

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1488

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

365

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

1046

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

581

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

431

2024.04.29

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

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

61

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号