修复php上传后缀名绕过漏洞需采用多层服务端校验:白名单硬编码允许.jpg等安全扩展名,禁用所有php执行后缀;校验magic bytes与真实mime类型;重命名文件并存至web根目录外或禁用脚本解析的目录。

修复PHP上传后缀名绕过漏洞,核心是摒弃依赖单一、易被绕过的校验方式,转向多层、服务端主导、语义级的文件类型控制。不能只拦后缀,更不能只信前端或Content-Type。
用白名单代替黑名单
黑名单极易遗漏变体(如.php3、.phtml、.phar、.pht、.php5等),而白名单只允许明确安全的扩展名,例如:.jpg、.png、.gif。注意:白名单必须在服务端硬编码实现,不能靠JavaScript或隐藏字段传递。
- 拒绝所有带PHP执行能力的后缀,哪怕它看起来“冷门”
- 避免使用正则模糊匹配(如
/\.php[0-9]?/i),改用精确字符串比对 - 若业务真需上传HTML类文件,应剥离脚本标签、禁用内联JS,并隔离到非Web可访问目录
校验文件内容而非仅看后缀
读取上传文件的前几百字节,验证Magic Bytes(文件头)是否与声称类型一致。例如GIF必须以GIF89a开头,PNG以‰PNG开头。仅靠$_FILES['file']['type']不可靠,该值由浏览器提供,可任意伪造。
- PHP中可用
finfo_open(FILEINFO_MIME_TYPE)获取真实MIME类型 - 对图片类文件,进一步调用
getimagesize()确认是否为有效图像 - 禁止上传空文件、超小文件(如2字节)——这类常用于绕过头检测
重命名+隔离存储路径
上传成功后,立即生成唯一随机文件名(如2a7f3e9b1d4c.jpg),丢弃原始文件名。同时将文件保存至Web根目录之外(如/var/uploads/),或至少确保上传目录禁用脚本解析(Apache加php_flag engine off,Nginx配置location ~ \.php$ { deny all; })。
- 不信任任何用户输入的文件名,包括原始
$_FILES['file']['name'] - 若必须放在Web目录下,上传目录需单独配置无执行权限
- 避免使用
move_uploaded_file()直接存到可访问路径而不重命名
补充防御层:解析器与WAF协同
即使文件进了服务器,也要防止被错误解析。例如Apache中删除AddHandler php-script .php3等非标准映射;Nginx中严格限制.php位置块作用域。配合WAF规则拦截含<?php 、eval(、system(等特征的上传请求,作为最后一道过滤。
- 检查服务器配置,移除对
.phtml、.php3、.phar等历史别名的支持 - 启用PHP的
open_basedir限制,防止上传文件跨目录包含 - 日志中记录所有上传行为(源IP、文件名、重命名后名称、MIME检测结果),便于溯源
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











