PHP 8.5 不支持通过 php.ini 限制上传文件类型,必须由代码运行时校验;需启用 file_uploads、设置合理大小参数并确保临时目录权限;校验须结合 finfo_open 检测 MIME 类型与小写扩展名白名单双重验证。

一、先确保上传功能已启用且路径通畅
检查 php.ini 中以下项是否正确(缺一不可):
- file_uploads = On —— 全局上传开关,关闭则整个功能失效
- upload_max_filesize 和 post_max_size 已设为合理值(如 64M / 72M),并已重启 php8.5-fpm
- upload_tmp_dir 指向的目录存在,且 www-data(或对应 Web 用户)有读写权限
二、用 PHP 代码做双重类型校验(推荐)
仅依赖 $_FILES['file']['type'] 不安全(前端可伪造),必须结合 MIME 类型检测 + 扩展名白名单:
- 用
finfo_open(FILEINFO_MIME_TYPE)真实读取文件头类型 - 用
pathinfo($name, PATHINFO_EXTENSION)提取扩展名,转小写后比对 - 两个条件必须同时满足,才算通过
示例代码:
$allowed_mimes = ['image/jpeg', 'image/png', 'application/pdf'];
$allowed_exts = ['jpg', 'jpeg', 'png', 'pdf'];
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $_FILES['file']['tmp_name']);
finfo_close($finfo);
$ext = strtolower(pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION));
if (!in_array($mime, $allowed_mimes) || !in_array($ext, $allowed_exts)) {
die('文件类型不被允许');
}
三、避免前端“假限制”误导
HTML 的 accept="image/*" 或 <input type="file" accept=".pdf,.docx"> 仅影响浏览器文件选择框,完全可绕过,不能作为安全依据,仅作用户体验优化。
立即学习“PHP免费学习笔记(深入)”;
四、额外加固建议
- 上传后重命名文件(去掉原始名,用 hash + 时间戳),防止恶意扩展名执行
- 目标保存目录不要放在 Web 可直接访问路径下;若必须放,加
.htaccess(Apache)或 location 配置(Nginx)禁止执行 PHP - 对 PDF、Office 文档等复杂格式,必要时调用外部工具(如
file命令或 LibreOffice)二次验证



















