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) ######[AI写代码神器 | 542点数解答 | 2025-06-24 15:37:24]
- 批处理文件:依据参数表.xlsx精准修改文件.txt中p、t、s值(GPT | 811点数解答 | 2024-12-05 12:58:37)402
- 用批处理和Python实现“参数表.xlsx”与“文件.txt”数据匹配及修改(讯飞星火 | 531点数解答 | 2024-12-05 13:20:42)382
- 批处理文件:依据参数表.xlsx精准修改文件.txt特定参数值(阿里通义 | 495点数解答 | 2024-12-05 13:22:26)359
- Java实现链表反转:迭代与递归双解法详解及开发实战指南(DeepSeek | 1409点数解答 | 2026-03-15 15:09:29)47
- .htaccess 配置:文件访问限制、重写规则大揭秘(GPT | 165点数解答 | 2024-09-12 17:05:58)267
- Typecho 博客评论模板深度剖析:功能、问题与改进建议(阿里通义 | 718点数解答 | 2025-08-08 13:24:09)183
- PHP 代码问题深度剖析:安全、可读、性能与兼容改进方案(字节豆包 | 2007点数解答 | 2025-08-08 13:25:08)264
- 工程师必知:软件系统用户文档编写九大要点揭秘(百度文心 | 350点数解答 | 2023-11-09 18:23:53)208
- Python 利用 win32com 库:将 Excel 转换为 A4 横向 PDF 并单独打印首列(字节豆包 | 507点数解答 | 2025-03-10 15:48:12)323
- C++ 实现我的世界基岩版:从简单框架到开发要点揭秘(字节豆包 | 182点数解答 | 2025-02-22 15:53:11)209
- C语言实现无人机航点编号冒泡排序及编号重置(字节豆包 | 541点数解答 | 2025-12-29 18:41:13)51
- C++ 实现完整斗地主:含洗牌、发牌与手牌展示,可按需扩展!(字节豆包 | 1028点数解答 | 2026-01-10 08:02:37)51