PHP 面试考点之文件上传详解
一、引言
在 PHP 开发中,文件上传是一个常见的功能需求,但同时也是一个容易出现安全漏洞的地方。在面试中,文件上传相关的考点常常被提及。本文将详细介绍 PHP 文件上传的面试考点,帮助大家更好地理解和应对。
二、文件上传的基本流程
- HTML 表单设置
在 HTML 中,创建一个表单用于上传文件,需要设置
enctype="multipart/form-data",这是因为文件上传需要特殊的编码方式。例如:<form action="upload.php" method="post" enctype="multipart/form-data"> <input type="file" name="fileToUpload" id="fileToUpload"> <input type="submit" value="上传文件" name="submit"> </form> - PHP 接收文件
在 PHP 中,通过
$_FILES超全局变量来接收上传的文件。$_FILES是一个二维数组,包含了上传文件的各种信息,如文件名(name)、临时文件名(tmp_name)、文件大小(size)、错误代码(error)等。例如:<?php if ($_FILES["fileToUpload"]["error"] > 0) { echo "错误:". $_FILES["fileToUpload"]["error"]. "<br>"; } else { // 处理上传文件 $tempName = $_FILES["fileToUpload"]["tmp_name"]; $targetDir = "uploads/"; $targetFile = $targetDir. basename($_FILES["fileToUpload"]["name"]); if (move_uploaded_file($tempName, $targetFile)) { echo "文件上传成功"; } else { echo "文件上传失败"; } } ?>
三、面试常考的安全问题
- 文件类型验证
- MIME 类型检查:可以通过
finfo_file函数获取文件的真实 MIME 类型。例如:$finfo = finfo_open(FILEINFO_MIME_TYPE); $mime = finfo_file($finfo, $tempName); finfo_close($finfo); $allowedMimes = ['image/jpeg', 'image/png']; if (!in_array($mime, $allowedMimes)) { echo "不允许的文件类型"; exit; } - 文件扩展名检查:虽然扩展名可以伪造,但也可以作为辅助验证。例如:
$fileExtension = strtolower(pathinfo($targetFile, PATHINFO_EXTENSION)); $allowedExtensions = ['jpg', 'png']; if (!in_array($fileExtension, $allowedExtensions)) { echo "不允许的文件扩展名"; exit; }
- MIME 类型检查:可以通过
- 文件大小限制
可以通过
$_FILES["fileToUpload"]["size"]来检查文件大小是否符合要求。例如:$maxSize = 5 * 1024 * 1024; // 5MB if ($_FILES["fileToUpload"]["size"] > $maxSize) { echo "文件过大"; exit; } - 路径遍历攻击防范
在拼接目标文件路径时,要确保不会出现路径遍历。例如:
$targetDir = "uploads/"; // 确保目标文件路径在指定目录内 if (strpos($targetFile, $targetDir)!== 0) { echo "非法路径"; exit; }
四、其他相关考点
- 临时文件处理
上传的文件首先会存储在临时目录(由
upload_tmp_dir配置项指定),使用move_uploaded_file函数将其移动到目标目录后,临时文件会被删除。如果不移动,临时文件会在脚本执行结束后被清理。 - 大文件上传
- PHP 配置:需要调整
upload_max_filesize(上传文件最大大小)和post_max_size(POST 数据最大大小,一般要大于upload_max_filesize)等配置项。 - 分块上传:对于非常大的文件,可以采用分块上传的方式,在后端进行文件合并。
- PHP 配置:需要调整
五、总结
在 PHP 文件上传的面试中,要熟悉文件上传的基本流程,重点掌握安全相关的考点,如文件类型验证(包括 MIME 类型和扩展名检查)、文件大小限制、路径遍历攻击防范等。同时,了解临时文件处理和大文件上传的相关知识。只有全面掌握这些内容,才能在面试中应对自如,并且在实际开发中确保文件上传功能的安全可靠。
文章版权声明:除非注明,否则均为Dark零点博客原创文章,转载或复制请以超链接形式并注明出处。

