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.pswp.cn/news/279966.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/279966.shtml
英文地址,請注明出處:http://en.pswp.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 …

mfs使用指引

客戶端工具集 mfsgetgoal #設定副本數mfssetgoal #獲取副本數mfscopygoal # mfsgetsclass mfssetsclass mfscopysclass mfsxchgsclass mfslistsclass mfsgettrashtime #設定回收站時間 mfssettrashtime #設定回收站時間 mfscopytrashtime mfsgeteattr #設置權限 mfsseteattr…

【命名規范】.NET中的枚舉類型,要以Enum結尾嗎?

“首先要給它一個名字&#xff0c;然后你才能描述它。”圖片&#xff1a;北京的晚霞 攝影師&#xff1a;劉先生這個話題源于公司《.NET技術規范》中的一條&#xff1a;【強制】枚舉聲明應以Enum結尾我對此并不認同&#xff1a;首先&#xff0c;引用一下微軟官方文檔中&#xff…

Linux中防火墻(一)

一&#xff1a;前言防火墻&#xff0c;其實說白了講&#xff0c;就是用于實現Linux下訪問控制的功能&#xff0c;它分為硬件的或者軟件的防火墻兩種。無論是在哪個網絡中&#xff0c;防火墻工作的地方一定是在網絡的邊緣。而我們的任務就是需要去定義到底防火墻如何工作&#x…

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…

Java 五大原則

1、單一職責 不論是在設計類&#xff0c;接口還是方法&#xff0c;單一職責都會處處體現&#xff0c;單一職責的定義&#xff1a;我們把職責定義為系統變化的原因。所有在定義類&#xff0c;接口&#xff0c;方法的時候。定義完以后再去想一想是不能多于一個的動機去改變這個類…

馬化騰發飆:很多業務該砍就砍,一批員工要被裁了

最近騰訊內部會議&#xff0c;馬化騰內部講話&#xff0c;頻頻上了熱搜。在會議中&#xff0c;馬化騰難得發飆表示&#xff1a;很多不盈利的業務該砍就砍。從網絡新聞報道來看&#xff0c;可能超過40個業務即將關掉&#xff0c;甚至包括幻核、QQ影音、看點快報、搜狗地圖、騰訊…

在ASP.Net和IIS中刪除不必要的HTTP響應頭

引入 每次當瀏覽器向Web服務器發起一個請求的時&#xff0c;都會伴隨著一些HTTP頭的發送.而這些HTTP頭是用于給Web服務器提供一些額外信息以便于處理請求。比如說吧。如果瀏覽器支持壓縮功能&#xff0c;則瀏覽器會發送Accept-Encoding HTTP頭&#xff0c;這樣一來服務器便知道…

SAP Customer Data Cloud(Gigya)的用戶搜索實現

我在Gigya前臺根據email搜索&#xff0c;輸入一個郵箱地址&#xff0c;回車&#xff0c;在Chrome開發者工具里觀察到到后臺的網絡請求&#xff1a; 這是一個post請求&#xff1a; __RequestVerificationToken 請求體&#xff1a; {"query":"SELECT * FROM accou…

C# ComboBox枚舉量綁定的 兩種方法

概述ComboBox綁定枚舉量的方法有很多&#xff0c;今天列舉比較常用的兩種&#xff0c;希望對讀者們一些幫助&#xff01;代碼講解前臺XMAL:<StackPanel><ComboBox Name"EvenType1" SelectedIndex"0" Margin"5"/><ComboBox Name&…

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…

Redis 哈希(Hash)

哈希hash又稱為散列、雜湊等&#xff0c;是將任意長度的輸入通過散列算法變換為固定長度的輸出&#xff0c;最終輸出也就是哈希值。這種轉換是一種壓縮映射。也就是說&#xff0c;散列值的空間通常要遠小于輸入控件&#xff0c;不同的輸入可能會散列成相同的輸出&#xff0c;所…

京東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…