酷代码 AI
菜单
全部AI  /  热门  /  AI写代码神器
服务商

编写一个安全的PHP上传文件代码

# PHP安全文件上传代码 ```php <?php // 定义允许上传的文件类型 $allowedTypes = ['image/jpeg', 'image/png', 'image/gif']; // 定义最大文件大小 (2MB) $maxFileSize = 2 * 1024 * 1024; // 定义上传目录 (确保该目录存在且有写权限) $uploadDir = 'uploads/'; // 检查是否通过POST方法上传文件 if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['file'])) { $file = $_FILES['file']; // 检查上传错误 if ($file['error'] !== UPLOAD_ERR_OK) { die('上传错误: ' . $file['error']); } // 验证文件类型 $finfo = new finfo(FILEINFO_MIME_TYPE); $mime = $finfo->file($file['tmp_name']); if (!in_array($mime, $allowedTypes)) { die('不允许的文件类型'); } // 验证文件大小 if ($file['size'] > $maxFileSize) { die('文件大小超过限制'); } // 生成安全的文件名 $extension = pathinfo($file['name'], PATHINFO_EXTENSION); $safeName = bin2hex(random_bytes(8)) . '.' . $extension; $destination = $uploadDir . $safeName; // 移动文件到目标目录 if (move_uploaded_file($file['tmp_name'], $destination)) { echo '文件上传成功: ' . htmlspecialchars($safeName); } else { die('文件移动失败'); } } ?> <!-- 简单的上传表单 --> <form method="post" enctype="multipart/form-data"> <input type="file" name="file" required> <button type="submit">上传</button> </form> ``` ## 安全注意事项 1. 文件类型验证:使用`finfo`检测实际MIME类型,而不是依赖客户端提供的类型 2. 文件名处理:生成随机文件名防止路径遍历攻击 3. 文件大小限制:防止大文件导致服务器资源耗尽 ## 额外逻辑点 - 确保上传目录权限设置为不可执行,防止上传的恶意脚本被执行 - 考虑添加病毒扫描功能,特别是对于用户上传的文件 - 对于图片文件,可以进一步验证是否为有效图片(使用GD库或Imagick) [2025-06-24 15:37:24 | AI写代码神器 | 542点数解答]

相关提问