PHP文件上传漏洞修复关键在切断攻击链三环节:文件名可控、内容不可信、目录可执行;须强制重命名、白名单后缀、finfo真实MIME校验、图片重绘、上传目录禁执行及环境加固。

PHP文件上传漏洞不是PHP本身的问题,而是开发者在处理上传时依赖不可信输入、跳过内容校验、放任执行环境造成的。修复关键不在“加个判断”,而在切断攻击链的三个环节:文件名可控、内容不可信、目录可执行。
强制重命名 + 白名单后缀
绝不能用$_FILES['file']['name']提取后缀——大小写(.PHP)、多点(a.php.)、NTFS流(shell.php::$DATA)都能绕过。
- 生成唯一文件名:用
bin2hex(random_bytes(16))或md5(uniqid() . time()) - 后缀必须硬编码:如
'.jpg',不拼接用户原始扩展名 - 保存前统一转小写,并过滤
%00、空格、../等路径污染字符
finfo真实校验MIME类型
$_FILES['type']和扩展名完全可伪造,必须读文件头确认真实类型。
- 调用
finfo_open(FILEINFO_MIME_TYPE)+finfo_file()获取MIME - 只允许白名单:
image/jpeg、image/png、application/pdf等 - 明确拒绝
text/plain、application/x-php、application/octet-stream
图片类文件必须重绘
getimagesize()和exif_imagetype()只读头部,无法识别图片末尾嵌入的PHP代码(即“图片马”)。
- 用
imagecreatefromjpeg()或imagecreatefrompng()加载原图 - 再用
imagejpeg()或imagepng()重新输出,丢弃所有元数据和尾部数据 - 保存的是新生成的二进制流,不是原始
tmp_name文件
上传目录禁执行 + 环境加固
即使文件名和内容都安全,服务器配置不当仍可能触发执行。
- Apache:在上传目录放置
.htaccess,内容为SetHandler default-handler - Nginx:对应
location中添加deny all;,或设fastcgi_param SCRIPT_FILENAME ""; - PHP配置:关闭
allow_url_include,上传目录不参与open_basedir,禁用exec、system等危险函数 - 权限:目录755,文件644,严禁
chmod 777
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











