修补文件上传和目录遍历漏洞需四方面同步加固:文件上传须白名单+内容检测+重命名;目录遍历须禁绝用户路径拼接、用映射表或realpath校验;存储须物理隔离+权限收紧;并叠加WAF、禁用危险函数、日志监控等硬性防护。

修补文件上传和目录遍历漏洞,核心是切断攻击者“上传恶意文件→让服务器执行→控制路径访问敏感资源”的链条。不能只堵一个环节,得从文件来源、存储位置、解析行为、访问权限四方面同步加固。
文件上传:用白名单+内容检测双锁死类型
单靠扩展名黑名单(如禁止.php)或前端JS校验毫无意义,攻击者轻松绕过。必须在服务端强制执行:
- 扩展名只允许 jpg、png、gif、pdf(按业务最小必要原则列白名单)
- 读取文件前512字节,用 getimagesize()(图片)、finfo_file()(通用)验证真实MIME类型,拒绝Content-Type头伪造
- 对图片类文件,额外检查是否含PHP标签(如<?php)、eval、system等危险函数字符串
- 重命名文件:丢弃原始文件名,生成随机字符串+固定安全后缀(如 abc123x78.png),彻底阻断解析漏洞利用
目录遍历:禁绝用户可控路径拼接
目录遍历本质是程序把用户输入直接拼进文件操作路径,比如 ./uploads/../../etc/passwd。修复关键在“不信任任何用户输入的路径片段”:
- 上传后保存路径必须是预定义的绝对路径(如 /var/www/uploads/),禁止拼接 $_GET['dir']、$_POST['path'] 等参数
- 若业务必须支持子目录(如用户分组上传),用映射表代替路径拼接:用户传 group_id=5 → 后端查表得对应安全目录 /uploads/group_5/
- 调用 realpath() 解析路径后,严格比对是否落在允许根目录内,超出即拒绝
- Web服务器配置上,禁止上传目录启用脚本解析(如Apache中 RemoveHandler .php 或 Nginx 中 location ~ ^/uploads/.*\.(php|phtml|sh)$ { return 403; })
存储与访问:物理隔离 + 权限收紧
即使文件本身安全,放错地方也会出事:
- 上传目录不要放在Web根目录下(如 /var/www/html/uploads/),应置于不可通过URL直接访问的位置(如 /var/www/uploads/),再通过PHP脚本做代理下载
- 上传文件系统权限设为 644,目录为 755,且属主不是Web服务运行用户(如www-data),防止上传后门反向写入
- 对需公开访问的上传文件(如头像),用独立域名或子路径(如 https://static.example.com/avatar/),并配置该域不解析PHP
补充硬性防护层
作为兜底手段,弥补代码疏漏:
- WAF规则拦截常见遍历特征:../、%2e%2e%2f、....// 及双写、编码变形
- 服务器层禁用危险函数(php.ini中关闭 allow_url_include、disable_functions = system,exec,passthru,shell_exec)
- 日志记录所有上传请求的源IP、文件名、大小、保存路径,异常高频上传自动告警


















