PHP 7.5无“后缀大小写绕过”漏洞,根源在于开发者未统一转小写校验扩展名;修复需服务端强制strtolower()后白名单校验,并叠加MIME检测、安全重命名及上传目录权限隔离。

PHP 7.5 本身不自带文件上传逻辑,所谓“后缀大小写绕过”漏洞,根源在于开发者编写的上传处理代码未对文件扩展名做统一、严格的标准化处理,而非 PHP 版本缺陷。修复关键不是升级 PHP,而是修正服务端校验逻辑。
统一转为小写并严格比对
黑名单或白名单校验前,必须将原始文件后缀强制转为小写,再参与判断。仅靠前端或中间件(如 Nginx)的大小写处理不可靠,服务端必须独立完成。
错误示例(易被 .PHP 绕过):
正确做法:
$ext = strtolower(pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION));if (in_array($ext, $deny_list)) { ... }
避免依赖单一校验维度
仅靠后缀名过滤极易失效。应叠加至少两项检查:
- 校验
$_FILES['file']['type'](但需注意该值由客户端提供,可伪造,仅作辅助) - 用
finfo_file()检查文件真实 MIME 类型(基于二进制头) - 对图片类文件,额外调用
getimagesize()或exif_imagetype() - 拒绝空后缀、点结尾、含不可见字符(如
%00、\x00)的文件名
重命名 + 隔离存储路径
不信任用户提交的任何文件名。上传后应使用安全随机名(如 uniqid().'.jpg'),并明确指定扩展名,彻底剥离原始后缀。
同时,上传目录不应在 Web 可访问路径下;若必须可访问,需配合 Web 服务器配置禁用脚本执行权限(例如 Apache 的 php_flag engine off,Nginx 的 location ~ \.(php|phtml)$ { deny all; })。
启用白名单机制
相比黑名单,白名单更安全可控。只允许上传明确需要的类型,例如:
$allow_ext = ['jpg', 'jpeg', 'png', 'gif', 'pdf'];$ext = strtolower(pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION));
if (!in_array($ext, $allow_ext)) { die('Invalid file extension.'); }
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











