关于文件上传返回数据的后缀名变成文件名的问题

1、首先排查,当前文件是否又传入文件名,

遇到过虽然传入了文件名,但是发现发送请求的文件名字变成了blob

解决方法

 参考文章

null最近为了响应系统对安全方面的要求,我们做的整改之一是对文件上传部分,除了在前端页面上限制用户可以选择的文件类型,还在后端接口中新增了对文件后缀名(这里主要是图片)的限制,核心代码如下。针对获取后缀名的代码单独做了测试后,确认了不是这段代码的的问题。那么问题应该是出现在前端了,也就是说,前端传过来的文件名称有问题,而且在观察前端请求时证明了这一猜想。插件进行图片切割头像,将切割后的头像转为blob文件上传。可是通过前端上传文件后,后端持续报错:无效的文件格式,见鬼。方法第三个参数设置为文件的名称即可。https://blog.csdn.net/u013810234/article/details/127142097?ops_request_misc=&request_id=&biz_id=102&utm_term=%E5%89%8D%E7%AB%AF%E4%B8%8A%E4%BC%A0%E6%96%87%E4%BB%B6%E4%B8%BA%E4%BB%80%E4%B9%88%E5%90%8E%E7%BC%80%E5%90%8D%E5%8F%98%E6%88%90%E4%BA%86%E6%96%87%E4%BB%B6%E5%90%8D&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-5-127142097.142^v68^js_top,201^v4^add_ask,213^v2^t3_control1&spm=1018.2226.3001.4187

2、文件名也有了,上传文件的格式也是对的,但是返回来的地址的后缀名变成了文件名

如图:

 

原因:再进行第一步的文件命名时,没有加入文件格式就直接命名了

解决办法:加上文件格式就可以了

### 文件上传过程中绕过 `basename()` 函数的安全限制 `basename()` 是 PHP 中的一个常用函数,用于返回路径中的文件名部分。然而,在一些不完善的实现中,攻击者可以通过构造特殊的文件名来绕过基于 `basename()` 的安全检查。 #### 基于 `basename()` 的常见问题 在许多情况下,开发者会简单地使用 `basename()` 来提取上传文件的名称并将其保存到目标目录中。例如: ```php $target_path = "uploads/"; $file_name = basename($_FILES["upload"]["name"]); $target_file = $target_path . $file_name; if (move_uploaded_file($_FILES["upload"]["tmp_name"], $target_file)) { echo "File uploaded successfully."; } else { echo "Error uploading file."; } ``` 这段代码虽然看似正常,但实际上存在安全隐患。如果攻击者提交一个带有特殊字符的文件名(如包含路径遍历),可能会导致意外行为[^3]。 --- #### 绕过方法分析 ##### 1. **利用路径遍历** 尽管 `basename()` 可以移除路径信息,但如果攻击者提供的是一个多层嵌套的路径结构,仍然可能导致意料之外的结果。例如: - 提交文件名为 `../../evil.php`。 - 虽然经过 `basename()` 后为 `evil.php`,但在某些配置错误的情况下,仍可能覆盖敏感文件或创建恶意文件[^5]。 ##### 2. **结合压缩包解压机制** 当上传的是压缩文件,即使调用了 `basename()` 处理外部文件名,内部文件的实际路径也可能未受到严格控制。例如: - 攻击者可以制作一个 ZIP 或 RAR 文件,其中包含具有路径遍历特性的文件名(如 `../webshell.php`)。 - 当服务端解压该文件,这些文件会被放置到指定的目标目录以外的位置[^5]。 ##### 3. **利用编码混淆** 有些应用程序会对输入数据进行简单的清理操作,但这并不足以防止高级攻击技术。例如: - 使用 URL 编码 (`%2F`) 替代斜杠 `/`; - 利用 Unicode 字符集中的相似符号(如全角字符 `\uFF0E` 表示点号 `.`, `\uFF0F` 表示斜杠 `/`)构建复杂文件名[^4]。 ##### 4. **滥用 MIME 类型检测不足** 即使启用了基本的扩展名过滤逻辑,也容易被绕过。例如: - 如果仅依赖后缀匹配而不验证实际内容类型,则可伪造 JPEG 图片携带隐藏 WebShell[^2]。 --- #### 实际案例演示 假设有一个易受攻击的应用程序如下所示: ```php <?php if (isset($_FILES['upload'])) { $target_dir = "uploads/"; $target_file = $target_dir . basename($_FILES['upload']['name']); if (!in_array(pathinfo($target_file, PATHINFO_EXTENSION), ['jpg', 'png'])) { die('Invalid file extension.'); } move_uploaded_file($_FILES['upload']['tmp_name'], $target_file); echo "Uploaded!"; } ?> <form action="" method="post" enctype="multipart/form-data"> Select image to upload: <input type="file" name="upload"><br> <input type="submit" value="Upload Image"> </form> ``` 在这种场景下,攻击者可通过以下手段实施攻击: 1. 构造带有多级目录穿越的文件名,如 `test.jpg/../../../evil.php`; 2. 创建伪装成合法图像格式但含有恶意脚本的内容; 3. 将上述两种方式结合起来形成更复杂的载荷. --- ### 安全建议 为了有效防御此类威胁,应采取综合措施: - 对用户提交的数据进行全面校验,不仅限于文件名本身还要考虑其真实性质. - 设置专门用于存放用户资料且不具备执行权限的隔离区域. - 应用随机化命名方案减少预测可能性同记录原始元数据以便后续审计追踪.[^2] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值