商务合作加微信:2230304070
学习与交流:PHP技术交流微信群
2025年 JetBrains全家桶通用激活码&账号 支持最新版本
https://web.52shizhan.cn
当PHP处理multipart/form-data的POST请求时,会将上传的文件临时存储在upload_tmp_dir指定的目录(默认是系统临时目录),并生成临时文件名。
// 攻击者可能尝试在文件被删除前访问临时文件
if (isset($_FILES['file'])) {
// 文件验证逻辑...
// 攻击者可能在验证期间访问临时文件
}
POST /upload.php HTTP/1.1
Content-Type: multipart/form-data; boundary=boundary
--boundary
Content-Disposition: form-data; name="file"; filename="../../../etc/passwd"
Content-Type: text/plain
恶意内容
--boundary--
; php.ini 安全配置
file_uploads = On
upload_max_filesize = 2M
upload_tmp_dir = /var/php_uploads/
open_basedir = /var/www/html
disable_functions = symlink
// 验证文件类型(不依赖MIME类型)
$allowed_extensions = ['jpg', 'png', 'gif'];
$file_info = pathinfo($_FILES['file']['name']);
$extension = strtolower($file_info['extension']);
if (!in_array($extension, $allowed_extensions)) {
die("文件类型不允许");
}
// 验证实际文件内容
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime_type = finfo_file($finfo, $_FILES['file']['tmp_name']);
finfo_close($finfo);
$allowed_mime_types = ['image/jpeg', 'image/png', 'image/gif'];
if (!in_array($mime_type, $allowed_mime_types)) {
die("文件MIME类型无效");
}
// 重新生成文件名
$new_filename = bin2hex(random_bytes(16)) . '.' . $extension;
$upload_path = '/var/www/uploads/' . $new_filename;
// 移动文件前检查
if (move_uploaded_file($_FILES['file']['tmp_name'], $upload_path)) {
// 成功上传
} else {
die("文件上传失败");
}
// 1. 文件内容扫描
functionscan_file_for_malicious_content($file_path){
$contents = file_get_contents($file_path);
// 检查可疑模式
$dangerous_patterns = ['<?php', 'eval(', 'base64_decode'];
foreach ($dangerous_patterns as $pattern) {
if (stripos($contents, $pattern) !== false) {
returnfalse;
}
}
returntrue;
}
// 2. 图片重压缩(破坏潜在恶意代码)
if ($mime_type === 'image/jpeg') {
$image = imagecreatefromjpeg($upload_path);
imagejpeg($image, $upload_path, 90);
imagedestroy($image);
}
// 3. 设置正确的文件权限
chmod($upload_path, 0644);
# Nginx配置限制
location ^~ /uploads/ {
# 禁止执行PHP
location~ \.php$ {
deny all;
}
# 只允许访问特定文件类型
location~* \.(jpg|jpeg|png|gif)$ {
# 正常访问
}
# 禁止其他文件访问
deny all;
}
记住:安全是一个持续的过程,需要结合技术防护、安全意识培训和定期安全测试来确保系统的安全性。

