PHP 7.4“上传路径可控”漏洞本质是未校验用户输入的文件名与目录参数,导致路径遍历;需严格校验扩展名、生成随机文件名、硬编码安全根目录、禁用脚本解析、校验真实MIME类型并记录日志。

PHP 7.4 中“上传路径可控”漏洞本质是开发者未对用户提交的文件名、目录参数做严格校验与过滤,导致攻击者可构造恶意文件名(如 ../../etc/passwd)或目录遍历路径,将文件写入任意服务器位置(如 Web 目录外、系统配置目录等),进而引发远程代码执行或敏感信息泄露。
严格校验并规范化上传文件名
不要直接拼接用户传入的 $_FILES['file']['name'] 或额外传入的 dirname 参数。应丢弃原始文件名,生成安全的唯一文件名:
- 使用
pathinfo($filename, PATHINFO_EXTENSION)提取扩展名,并白名单校验(如只允许jpg、png、pdf) - 用
uniqid() . bin2hex(random_bytes(8))生成随机文件名,避免预测和覆盖 - 强制统一小写并去除所有非字母数字字符(
preg_replace('/[^a-zA-Z0-9.]/', '', $ext)),防止 Unicode 绕过
禁止路径遍历,限制保存目录范围
上传目标路径必须是预设的绝对安全目录(如 /var/www/uploads/),且不能被用户输入影响:
- 硬编码上传根目录,禁止从
$_GET、$_POST或$_FILES中读取路径参数 - 若需分目录存储(如按日期),用固定格式生成子路径:
$subdir = date('Y/m');,再拼接为$uploadDir = $root . '/' . $subdir; - 调用
realpath($uploadDir)获取真实路径,并用str_starts_with()(PHP 8.0+)或strpos()检查是否仍位于白名单根目录内(例如:0 === strpos(realpath($target), '/var/www/uploads'))
禁用危险文件解析与执行
即使文件存到了上传目录,也要防止服务器误解析为 PHP 脚本执行:
- 确保上传目录在 Web 服务器(如 Nginx/Apache)中禁用脚本执行:Nginx 可加
location ~ \.php$ { deny all; };Apache 可用.htaccess禁用AllowOverride None或明确拒绝php解析 - 上传后可调用
finfo_open(FILEINFO_MIME_TYPE)校验实际文件类型(非仅扩展名),拒绝application/x-php、text/x-php等类型 - 对图片类文件,可调用
getimagesize()进一步确认是否为有效图像
其他关键加固点
补充性但不可省略的防护措施:
- 设置
upload_max_filesize和post_max_size合理上限,防止 DoS 或大文件绕过检测 - 启用
is_uploaded_file()验证文件确实来自$_FILES,而非伪造路径 - 上传完成后立即调用
move_uploaded_file(),切勿用copy()或file_put_contents()写入用户可控路径 - 日志记录上传行为(文件名、大小、IP、时间),便于事后审计
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











