PHP表单空提交图片字段报Undefined offset:1错误修复
问题现象
提交表单时空置图片上传字段,页面抛出如下提示:
Notice: Undefined offset: 1 in ......... on line 44
携带图片提交表单时运行正常,可成功向4张关联数据库表写入数据。
报错原因
- 空值判断逻辑存在漏洞:当多文件上传字段未选择任何文件时,
$_FILES['multipleFile']['name']并非空数组,而是携带一个空字符串元素的数组,原有!empty()判断会误识别为存在上传文件,直接进入后续处理流程 - 后缀解析逻辑未做边界判断:对空文件名执行
explode('.', 空字符串)时,返回的数组仅包含索引为0的空值元素,直接访问$fileExnt[1]就会触发Undefined offset报错 - 后缀校验规则存在安全隐患:允许的文件后缀列表中包含空字符串,可被恶意利用上传非法文件
修复代码
替换原有图片上传入库逻辑段为以下代码即可:
// 校验上传字段合法性 if (isset($_FILES['multipleFile']) && is_array($_FILES['multipleFile']['name'])) { $allowImg = ['png', 'jpeg', 'jpg']; foreach ($_FILES['multipleFile']['name'] as $index => $fileName) { // 跳过未选择文件的空项 if ($_FILES['multipleFile']['error'][$index] === UPLOAD_ERR_NO_FILE) { continue; } // 跳过存在上传错误的项 if ($_FILES['multipleFile']['error'][$index] !== UPLOAD_ERR_OK) { continue; } // 跳过大小异常的文件 if ($_FILES['multipleFile']['size'][$index] <= 0) { continue; } // 安全获取文件后缀,避免无后缀文件名触发报错 $fileExt = strtolower(pathinfo($fileName, PATHINFO_EXTENSION)); if (!in_array($fileExt, $allowImg)) { continue; } $fileTmp = $_FILES['multipleFile']['tmp_name'][$index]; $newFile = rand() . '.' . $fileExt; $targetPath = 'upload/' . $newFile; if (move_uploaded_file($fileTmp, $targetPath)) { // 写入gallery表 $gallery = $conn->prepare("INSERT INTO gallery (gpranet_id,image,caption) VALUES (:parent_id,:image,:caption)"); $gallery->execute([ ':parent_id' => $lastenterid, ':image' => $newFile, ':caption' => $newFile, ]); } } }
实现效果
- 用户不上传图片提交表单时,逻辑会自动跳过所有空上传项,不执行文件上传和gallery表写入操作,表单正常提交无报错
- 用户携带图片提交时,原有上传、多表写入逻辑不受影响
- 修复了原后缀校验存在的空后缀绕过风险
内容的提问来源于stack exchange,提问作者sambhu lambhu
相关产品推荐
相关产品推荐

