php文件安全实现
文件上传安全验证
验证文件类型和扩展名是否匹配,避免恶意文件伪装。使用finfo_file检测MIME类型而非仅依赖客户端提交的$_FILES['file']['type']。
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $_FILES['file']['tmp_name']);
$allowed_mimes = ['image/jpeg', 'image/png'];
if (!in_array($mime, $allowed_mimes)) {
throw new Exception('Invalid file type');
}
存储路径隔离
将上传文件存储在web根目录之外,通过PHP脚本控制访问。使用随机生成的文件名防止路径遍历攻击。

$upload_dir = '/var/www/private_uploads/';
$filename = bin2hex(random_bytes(16)) . '.jpg';
move_uploaded_file($_FILES['file']['tmp_name'], $upload_dir . $filename);
文件权限控制
设置严格的文件系统权限,上传目录禁止执行权限。Linux系统建议配置:
chmod($upload_dir, 0750); // 所有者读写执行,组用户读执行,其他无权限
chmod($upload_dir.$filename, 0640); // 所有者读写,组用户读,其他无权限
病毒扫描集成
对上传文件进行病毒扫描,可使用ClamAV等开源工具:

$clamscan = '/usr/bin/clamscan';
$output = shell_exec("$clamscan --stdout ".escapeshellarg($upload_dir.$filename));
if (strpos($output, 'Infected files: 0') === false) {
unlink($upload_dir.$filename);
throw new Exception('Virus detected');
}
文件包含防护
禁止动态包含用户可控的文件路径,禁用危险函数:
ini_set('allow_url_fopen', 'Off');
ini_set('allow_url_include', 'Off');
日志记录审计
记录所有文件操作行为,便于安全审计:
$log = sprintf(
"[%s] %s uploaded %s (%s)\n",
date('Y-m-d H:i:s'),
$_SERVER['REMOTE_ADDR'],
$filename,
$_FILES['file']['size']
);
file_put_contents('/var/log/file_uploads.log', $log, FILE_APPEND);






