2022年底C# 解压zip文件遇到的一个Bug

本文由网友投稿。

作者:江湖人士

原文标题:2022年底C# 解压zip文件遇到的一个bug

原文链接:https://jhrs.com/2022/46060.html

最近在排查一个上传功能时,客户端上传的是zip文件,到服务器端后使用C# 解压zip文件的代码将上传文件解压后验证是否是允许上传的文件类型,并且要验证乱改文件后缀啊,文件头什么的都要走一遭,结果解压zip文件时就出妖蛾子了。

C# 解压zip文件

先说一下前文(或者上下文),在IIS上部署了一个文件服务站点,用于上传各类文件,流程上是先上传到站点根目录里面随机创建的一个临时目录(这里采用偷懒方案,直接使用guid做为目录名创建),先通过文件验证后再将其通过代码剪切或者复制到正式存档目录,C# 复制或者移动文件[1]的代码可以参考江湖人士[2]网的这篇文章。昨天快下班时发现上传zip文件时报错,在文件服务根站点创建了很多很多的guid开头的目录,我的妹呀,这下玩犊子了,事出反常必有妖啊,肯定代码出错了。

ce1c293dd5379fb0e2ac3979bfe60b0d.png

有bug的解压代码

这都马上2022年底了,出了这bug后,赶紧搭建个模拟环境跑一下,发现如下原来的代码确实有问题,原始代码如下:

/// <summary>
/// 解压文件
/// </summary>
/// <param name="saveDir">保存目录</param>
/// <param name="stream"></param>
public static void UnZipFiles(string saveDir, Stream stream)
{using (ZipInputStream s = new ZipInputStream(stream)){ZipEntry theEntry;while ((theEntry = s.GetNextEntry()) != null){string directoryName = $"{saveDir}{Path.GetDirectoryName(theEntry.Name)}\\";string fileName = Path.GetFileName(theEntry.Name);Directory.CreateDirectory(directoryName);using (FileStream streamWriter = File.Create(directoryName + fileName)){byte[] data = new byte[2048];while (true){int size = s.Read(data, 0, data.Length);if (size > 0){streamWriter.Write(data, 0, size);}else{break;}}}}}
}

对了,这里需要说明一下,这是以前的老项目,因此压缩,解压使用了 ICSharpCode.SharpZipLib.Zip 这个组件。

当打开源码来看,一眼就发现了问题所在,逻辑不严谨导致,解压文件保存目录直接拼接。

如何修复此bug?

知道了问题所在,修复自然简单,调用Path.Combine[3]方法即可,解压时再判断一下是目录还是文件即可,最终修复后的代码如下:

/// <summary>
/// 解压文件
/// </summary>
/// <param name="saveDir">保存目录</param>
/// <param name="stream"></param>
public static void UnZipFiles(string saveDir, Stream stream)
{using (ZipInputStream s = new ZipInputStream(stream)){ZipEntry theEntry;string directoryName, file, fileName;while ((theEntry = s.GetNextEntry()) != null){directoryName = Path.Combine(saveDir, Path.GetDirectoryName(theEntry.Name));fileName = Path.GetFileName(theEntry.Name);Directory.CreateDirectory(directoryName);file = Path.Combine(directoryName, fileName);if (theEntry.IsFile){using (FileStream streamWriter = File.Create(file)){byte[] data = new byte[2048];while (true){int size = s.Read(data, 0, data.Length);if (size > 0){streamWriter.Write(data, 0, size);}else{break;}}}}}}
}

参考资料

[1]

C# 复制或者移动文件: https://jhrs.com/2022/45307.html

[2]

江湖人士: https://jhrs.com/

[3]

Path.Combine: https://learn.microsoft.com/zh-cn/dotnet/api/system.io.path.combine?view=net-7.0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/279966.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何关闭mcafee软件_如何摆脱McAfee的通知和捆绑软件

如何关闭mcafee软件McAfee, like most other modern antivirus programs, doesn’t stay out of your way. It installs browser extensions and shows various alert messages you might not want to see. If McAfee came with your PC, you may regularly see messages that …

【命名规范】.NET中的枚举类型,要以Enum结尾吗?

“首先要给它一个名字&#xff0c;然后你才能描述它。”图片&#xff1a;北京的晚霞 摄影师&#xff1a;刘先生这个话题源于公司《.NET技术规范》中的一条&#xff1a;【强制】枚举声明应以Enum结尾我对此并不认同&#xff1a;首先&#xff0c;引用一下微软官方文档中&#xff…

macos安全性偏好设置_如何更改macOS系统偏好设置的布局

macos安全性偏好设置If you don’t care for the way the System Preferences appear in macOS, you can change them by hiding certain preference panels or by rearranging them alphabetically. 如果您不喜欢系统偏好设置在macOS中的显示方式&#xff0c;则可以通过隐藏某…

机器视觉技术在表面缺陷检测方面的发展趋势

导读&#xff1a;机器视觉技术在表面缺陷检测方面的发展趋势如何&#xff1f;很多人都不了解&#xff0c;据悉&#xff0c;目前工业中应用的机器视觉检测绝大部分执行的是二维检测任务&#xff0c;三维机器视觉检测仍处于理论研究和试验阶段。除此之外&#xff0c;机器视觉检测…

J.U.C之AQS

AQS是J.U.C的核心 AQS(AbstractQueuedSynchronizer)队列同步器&#xff0c;AQS是JDK下提供的一套用于实现基于FIFO等待队列的阻塞锁和相关的同步器的一个同步框架。 同步器面向的是锁的实现者&#xff0c;它简化了锁的实现方式&#xff0c;屏蔽了同步状态管理、线程的排队、等待…

.NET周报【12月第3期 2022-12-23】

由于众所周知的原因&#xff0c;大佬们纷纷加入羊群&#xff0c;笔者也未能幸免&#xff0c;体验下来这绝对不是普通感冒的症状&#xff0c;身体不适&#xff0c;熬了几天&#xff0c;所以本周更新比较晚&#xff1b;另外精力有限&#xff0c;对于国际板块只有链接没有简介&…

亚马逊的vps多少钱一个月_如何查看您在亚马逊上花了多少钱

亚马逊的vps多少钱一个月Have you ever wondered how much you’ve spent at Amazon during your lifetime? Whether you’re feeling curious or just plain brave, there’s an easy way to find out. 您是否想过一生在亚马逊上花了多少钱&#xff1f; 无论您是好奇还是勇敢…

JavaScript-client、offset、scroll、定时器

client offset scroll client、offset、scroll系列 他们的作用主要与计算盒模型&#xff0c;盒子的偏移量和滚动有关 clientTop 内容区域到边框顶部的距离&#xff0c; 说白了&#xff0c; 就是边框的高度 clientLeft 内容区域到边框左部的距离&#xff0c; 说白了&#xff0…

在ASP.Net和IIS中删除不必要的HTTP响应头

引入 每次当浏览器向Web服务器发起一个请求的时&#xff0c;都会伴随着一些HTTP头的发送.而这些HTTP头是用于给Web服务器提供一些额外信息以便于处理请求。比如说吧。如果浏览器支持压缩功能&#xff0c;则浏览器会发送Accept-Encoding HTTP头&#xff0c;这样一来服务器便知道…

springboot + mybatis + gradle项目构建过程

1.从Spring boot官网根据需求下载脚手架或者到GitHub上去搜索对应的脚手架项目,D_iao ^0^ • 文件目录如下&#xff08;此处generatorConfig.xml 和 log4j2.xml文件请忽略&#xff0c;后续会讲解&#xff09; 2.使用Mybatis代码自动构建插件生成代码 • gradle 相关配置 // My…

基于间隔推送全量更新数据状态的设计方法

2019独角兽企业重金招聘Python工程师标准>>> 假如有个直播间&#xff0c;在数据有更新的时候&#xff0c;能及时反映在客户端上。通信方式来说&#xff0c;有两种&#xff1a; 1、拉取模式。 2、推送拉取模式&#xff08;或者纯推送&#xff09; 拉取模式&#xff0…

京东Vue组件库NutUI 2.0发布:将支持跨平台!

NutUI 是一套来自京东用户体验设计部&#xff08;JDC&#xff09;前端开发部的移动端 Vue 组件库&#xff0c;NutUI 1.0 版本于 2018 年发布。据不完全统计&#xff0c;目前在京东至少有30多个 web 项目正在使用 NutUI。 经过一段时间紧锣密鼓的开发&#xff0c;近期&#xff0…

macbook 下载时睡眠_MacBook进入睡眠状态时如何自动使其静音

macbook 下载时睡眠You open your MacBook to take notes in class or during a meeting, and your music starts playing. Loudly. Not only did you disrupt everyone, you also revealed your passion for 90’s boy bands to a room full of people who once respected you…

Mac 的mysql5.7没有配置文件,如何解决only_full_group_by 问题

数据库版本是5.7.19&#xff0c;在写语句的时候&#xff0c;只要涉及ORDER BY,就会报错&#xff0c; ERROR 1055 (42000): Expression #7 of SELECT list is not in GROUP BY clause and contains nonaggregated column postscan.verifyDelayLog.auditor which is not function…

Spring MVC 入门(一)

什么是 Spring MVC 学习某一样东西之前&#xff0c;我们一定要大致知道这个东西是什么&#xff0c;能干什么&#xff0c;为什么要用它。 Spring MVC 是一个开源平台&#xff0c;一个基于 Spring 的 MVC 框架&#xff0c;它支持基于 Java 开发 Web 应用程序。MVC 架构很利于开发…

开源网关 Apache APISIX 认证鉴权精细化实战讲解

关注公众号并添加到“星标⭐”&#xff0c;防止错过消息后台回复【资料包】获取学习资料GitOps 新手入门到专家进阶实战详细教程作者钱勇&#xff0c;API7.ai 开发工程师&#xff0c;Apache APISIX Committer在当下云原生越发成熟的环境下&#xff0c;API 网关最核心的功能可以…

python应用POP3、IMAP、SMTP 协议,获取邮箱验证码

&#xff30;&#xff2f;&#xff30;&#xff13;和&#xff29;&#xff2d;&#xff21;&#xff30;是邮件相关的协议&#xff0c;&#xff29;&#xff2d;&#xff21;&#xff30;是比&#xff30;&#xff2f;&#xff30;&#xff13;更高级一点的协议&#xff0c;实…

固件中启用的虚拟化否_哪些固件或硬件机制可启用强制关机?

固件中启用的虚拟化否At one time or another, all of us have had to force our computers to shut down by pushing and holding the power button down until they powered off. Is this mechanism hardware-based, firmware-based, or both? Today’s SuperUser Q&A p…

.NET 云原生架构师训练营(基于 OP Storming 和 Actor 的大型分布式架构二)--学习笔记...

▲ 点击上方“DotNet NB”关注公众号回复“1”获取开发者路线图学习分享 丨作者 / 郑 子 铭 这是DotNet NB 公众号的第202篇原创文章目录为什么我们用 OrleansDapr VS OrleansActor 模型Orleans 的核心概念结合 OP Storming 的实践结合 OP Storming 的实践业务模型设计模型代…

PHP 多维数组转json对象

PHP 多维数组转json对象 php 数组转json对象&#xff0c;可能大家都知道要用json_encode,但是转换出来的格式多有不同&#xff0c;此处做个小小的记录&#xff01; 1. 一维数组转json对象 <?php $arr_1 [one, two, three]; var_dump(json_encode($arr_1)); $arr_2 [0 >…