超全!安全 PHP 上传文件代码示例及额外注意要点
以下是一个安全的 PHP 上传文件的代码示例,此代码包含了文件类型检查、文件大小限制、文件名安全处理等安全措施。 ```php <?php // 设置允许上传的文件类型 $allowedTypes = array('jpg', 'jpeg', 'png', 'gif'); // 设置最大文件大小(单位:字节),这里设置为 2MB $maxFileSize = 2 * 1024 * 1024; // 上传文件的目标目录 $uploadDir = 'uploads/'; // 检查目标目录是否存在,如果不存在则创建 if (!is_dir($uploadDir)) { mkdir($uploadDir, 0777, true); } // 检查是否有文件上传 if (isset($_FILES['file'])) { $file = $_FILES['file']; // 获取文件扩展名 $fileExtension = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION)); // 检查文件类型是否允许 if (in_array($fileExtension, $allowedTypes)) { // 检查文件大小是否超过限制 if ($file['size'] <= $maxFileSize) { // 生成安全的文件名 $safeFileName = uniqid() . '.' . $fileExtension; $uploadPath = $uploadDir . $safeFileName; // 移动上传的文件到目标目录 if (move_uploaded_file($file['tmp_name'], $uploadPath)) { echo "文件上传成功!"; } else { echo "文件上传失败,请重试。"; } } else { echo "文件大小超过限制,请选择小于 2MB 的文件。"; } } else { echo "不允许的文件类型,请上传 JPG、JPEG、PNG 或 GIF 文件。"; } } else { echo "未选择要上传的文件。"; } ?> <!DOCTYPE html> <html> <head> <title>文件上传</title> </head> <body> <form action="" method="post" enctype="multipart/form-data"> <input type="file" name="file"> <input type="submit" value="上传文件"> </form> </body> </html> ``` 额外需要注意的逻辑点 1. 对于上传目录的权限设置要谨慎,`0777` 权限在生产环境中可能存在安全风险,建议根据实际情况调整权限。 2. 在生成安全文件名时,使用 `uniqid()` 可以避免文件名冲突,但在高并发场景下可能会有重复的风险,可以结合时间戳等方式进一步增强文件名的唯一性。 3. 代码中的文件类型检查是基于文件扩展名的,这种方式不够安全,建议结合 `finfo_file()` 函数来检查文件的真实 MIME 类型。 ######[AI写代码神器 | 658点数解答 | 2025-06-24 15:40:40]
- 批处理文件:依据参数表.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)322
- 探寻数组中最长摆动子序列长度:思路剖析与代码优化(GPT | 758点数解答 | 2024-12-23 23:18:29)283
- 独家剖析:求解数组最长摆动子序列长度的代码实现与改进建议(GPT | 350点数解答 | 2024-12-23 23:20:54)279
- Three.js 示例代码解析:优化场景渲染与注意要点(字节豆包 | 164点数解答 | 2025-02-27 23:30:20)279