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

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

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

C# 解压zip文件

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

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

有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方法即可,解压时再判断一下是目录还是文件即可,最终修复后的代码如下:

        /// <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;
                                }
                            }
                        }
                    }
                }
            }
        }
2022年底C# 解压zip文件遇到的一个bug
2022 年底C# 解压zip文件遇到的一个bug 3

猜你喜欢

本站最新优惠

Namesilo优惠:新用户省 $1 域名注册-优惠码:45D%UYTcxYuCloZ 国外最便宜域名!点击了解更多

特别优惠:免费赠送 $100 Vultr主机-限时优惠!英文站必备海外服务器!点击了解更多

VPS优惠:搬瓦工优惠码:BWH3OGRI2BMW 最高省5.83%打开外面世界的一款主机点击了解更多

加入电报群

【江湖人士】(jhrs.com)原创文章,作者:江小编,如若转载,请注明出处:https://jhrs.com/2022/46060.html

扫码加入电报群,让你获得国外网赚一手信息。

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

(0)
江小编的头像江小编
上一篇 2022-12-20 16:44
下一篇 2022-12-23 16:31

热门推荐

发表回复

登录后才能评论
畅访海外网站,外贸/外企/科技工作者专用工具,无缝体验真实的互联网,解锁LinkedIn访问
$19.95 /年
直达官网