php文件安全实现
文件上传安全验证
确保上传的文件类型符合预期,通过检查文件扩展名和MIME类型双重验证。使用finfo_file函数获取文件的真实MIME类型,避免仅依赖客户端提供的类型信息。
$allowedTypes = ['image/jpeg', 'image/png'];
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $_FILES['file']['tmp_name']);
if (!in_array($mime, $allowedTypes)) {
die('Invalid file type');
}
文件存储隔离
将上传文件存储在Web根目录之外的非可执行目录中,通过PHP脚本控制访问。为每个用户创建独立子目录,防止目录遍历攻击。
$uploadDir = '/var/www/uploads/' . session_id() . '/';
if (!is_dir($uploadDir)) {
mkdir($uploadDir, 0750, true);
}
文件名安全处理
对上传文件名进行重命名,使用随机生成的字符串代替原始文件名。移除所有特殊字符和路径信息,防止路径注入攻击。

$extension = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);
$newName = bin2hex(random_bytes(16)) . '.' . $extension;
$targetPath = $uploadDir . $newName;
文件内容扫描
对上传文件进行病毒扫描和内容检查,特别是可执行文件。使用第三方工具如ClamAV或自定义规则检查文件签名。
exec('clamscan --quiet ' . escapeshellarg($_FILES['file']['tmp_name']), $output, $returnCode);
if ($returnCode !== 0) {
unlink($_FILES['file']['tmp_name']);
die('Malicious content detected');
}
访问权限控制
设置严格的文件系统权限,确保上传目录不可执行。限制PHP脚本对上传文件的处理权限,遵循最小权限原则。

chmod($targetPath, 0640);
chown($targetPath, 'www-data');
chgrp($targetPath, 'www-data');
安全下载实现
提供文件下载时强制设置正确的Content-Type头,禁止直接文件链接访问。对下载请求进行身份验证和授权检查。
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.basename($filePath).'"');
readfile($filePath);
日志记录与监控
记录所有文件操作行为,包括上传、下载和删除操作。监控异常文件活动模式,如短时间内大量上传请求。
$logEntry = date('Y-m-d H:i:s') . ' - User ' . $_SESSION['user_id'] . ' uploaded ' . $newName;
file_put_contents('/var/log/file_operations.log', $logEntry . PHP_EOL, FILE_APPEND);






