台灣最大程式設計社群網站
線上人數
798
 
會員總數:242931
討論主題:187836
歡迎您免費加入會員
討論區列表 >> ASP.NET >> 上傳檔案會發生資料外漏問題
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
上傳檔案會發生資料外漏問題
價值 : 50 QP  點閱數:339 回應數:13

樓主

Jungle
初學者
80 1
111 19
發送站內信

不好意思 爬過很多文 都沒有相關的文章可以參考

也看了很多相關設定的IIS的設定 config的設定

似乎都沒什麼作用 也嘗試了robots.txt 去隔絕google搜尋

可是我的問題似乎沒有影響

我的問題是說如果現在我做了一個上傳檔案的動作

我存在根目錄底下的upload 的資料夾內

儲存的格式為圖片格式(jpg,gif,png)

存進去沒有問題,讀取資料也是正常的

當我點下查看附件功能時也是正常的

但問題來了,我的網頁是有開放外網連進來的 (公司用的)

當點擊查看附件時,網址根目錄、資料夾、檔案名稱完整顯示出來在網址列





所以我可以合理的想成

當如果別人知道你的檔案名稱(程式會更改上傳資料的名稱) 也知道一點點網頁的常識時候

那上傳的資料不是就都會被人盜用或截取等等?

這個問題我想了很久 可是都沒有辦法可以解決 有辦法可以解決嗎?

謝謝各位

搜尋相關Tags的文章: [ 上傳檔案 ] , [ 個資外漏 ] , [ 外網 ] ,
本篇文章發表於2018-06-08 16:37
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
回應

WEI
檢舉此回應
我們公司也有一樣的問題,一直不知道怎麼辦!!

只知道可以跟 GOOGLE 移除網址

讓搜詢時無法搜到

本篇文章回覆於2018-06-08 17:02
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
回應

Forevertim
檢舉此回應
那上傳的資料不是就都會被人盜用或截取等等?
可以試著將上傳的檔案名稱作編碼
例如上傳 123.txt --> 20180608052420.txt 之類的
然後上傳的原始檔名,記錄在資料庫內
這樣子就不太好猜到檔案是什麼了~

或是上傳的那個資料匣,鎖一下權限
本篇文章回覆於2018-06-08 17:28
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
作者回應

Jungle
檢舉此回應
Forevertim 大大
更改上傳的檔名這個部份我們也有去做
有更改它的名字 可是感覺這還不是一個好的解決辦法耶?

因為就一樣的意思 他只要再網址列打出我們更改的圖片檔名其實一樣可以讀取我們的上傳檔案資料
我們的上傳資料是可以給使用者或某些允許人員去觀看的
可是如果是有心人事 其實只要知道目錄位置 然後可以開始猜檔案名稱

那請問一下 權限該怎麼設定呢? 是在IIS那邊嗎 還是哪裡可以做設定

不好意思,新手 可能問題有點多 見諒。
本篇文章回覆於2018-06-09 04:02
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

topcat
捐贈 VP 給 topcat 檢舉此回應
如果有這個擔心
可以把檔案放在非虛擬路徑的位置(檔案總管中的某個位置,並且在IIS上沒有設定可連接的位置)
那麼,檔案要怎麼讓別人點選下載?
當點選下載時,才用程式去讀去,放到Stream中,並且輸出出去
這樣,使用者就可以透過您的程式來下載檔案
而相關檔案,沒有透過您的程式,是無法直接透過連結來下載

相關Stream下載的寫法,可以搜尋關鍵字『asp.net stream download』

^_^
本篇文章回覆於2018-06-10 00:14
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
作者回應

Jungle
檢舉此回應
回喵喵:

這個方法理論上應該是可行的
可是現在我有個問題困擾

因為我不知道該怎麼去驗證這個方法

現在方法有了,技巧有了
可是我不知該從如何下手...


我們的路徑是存在資料庫,然後再使用a href="" 去做包裝起來
如果使用者是用google瀏覽器 ,也會直接下載
我們在a href處還有多一個函數 download
所以他們會自動下載

像這個方法想驗證喵喵大的方法 我該怎麼去改寫程式還是怎麼去驗證呢...?
本篇文章回覆於2018-06-12 08:34
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
回應

leoqrs
捐贈 VP 給 leoqrs 檢舉此回應
圖片的話
可以使用base64 image的方式顯示,這樣不會有路徑問題
使用方法可以直接google搜尋base64 image
本篇文章回覆於2018-06-12 09:28
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
作者回應

Jungle
檢舉此回應
回 leoqrs :

你這個方法是不是跟樓上的喵喵大的意思好像差不多?

就是存在虛擬的位置 然後在網址列就不會顯示出真實的檔案位置跟檔案名稱

然後資料庫儲存路徑時儲存真實的位置

而當使用者點下查看附件時, 再從資料庫抓取真實路徑 再進行轉換成base64秀出來 這個樣子嗎?

如果有錯誤,麻煩幫我更正一下 謝謝!
本篇文章回覆於2018-06-12 13:44
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
最有價值解答

topcat
捐贈 VP 給 topcat 檢舉此回應
to #5
小喵做的話,大概會這樣
1.在資料庫中,放一個資料表,記錄檔案代號(不重複的號碼)與檔案實體路徑(檔案存放在硬碟的哪裡)
例如:


如果還要限制某些人才可以下載,也可以再一個資料表,記錄誰可以有權限
例如:



2.撰寫一隻aspx『DownloadFile.aspx』,該aspx有以下的功能


3.B.aspx需要連結下載
就寫成這樣


這樣,就可以下載檔案時,開啟DownloadFile.aspx這個程式
這程式會判斷使用者是否有登入,甚至判斷使用者是否有該檔案的權限
沒有權限,就直接導向某錯誤畫面
有權限,就依據FGUID,讀取檔案實體位置,將之用FileStream讀入Server記憶體,然後再輸出指定檔案類型(副檔名)

就醬子,如果直接點選連結,或者擷取連結的人
由於可能沒有登入,或者有登入,卻沒有該檔案權限
就可以直接拒絕該使用者下載檔案

寫相關範例需要時間∼
樓主不妨先找找,
1.如何把檔案讀入MemoryStream
2.如何把MemoryStream的內容,輸出變成檔案下載

以上^.^a



本篇文章回覆於2018-06-12 13:47
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
不錯的參考

leoqrs
捐贈 VP 給 leoqrs 檢舉此回應
若是需要給使用者下載,推薦使用喵大的方式
若是單純顯示並且不顯示路徑、檔名
則可以直接將Base64Image字串直接放於asp:Image的ImageUrl內



本篇文章回覆於2018-06-12 14:35
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
作者回應

Jungle
檢舉此回應
好訊快報

目前已經完成網址列不顯示位置和檔案

我的方法採用 喵大的方法!

先將一個資料表創建完成後

設定使用者權限還有一個不重複的唯一值(識別碼)

並且進入時判斷有無觀看權限

確定使用者可以觀看後,再回傳圖片並顯示出來or下載

以下我的程式碼:(由於喵大是提供另一個aspx的網頁判斷,而我是使用泛型檔(ashx)進行判斷,若要使用請自行變換寫法)




//這是喵大提供的方法 而網址列也只會出現這串 不會出現真實的位置






本篇文章回覆於2018-06-13 11:24
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
11樓
回應

topcat
捐贈 VP 給 topcat 檢舉此回應
恭喜您先
找到了方法

一個提醒:

如果參數是數字,使用的人難免可能會隨意不斷的+1或-1,來看看會下載了什麼

小喵用的是GUID(例如:83A0D9B2-4055-4050-9A89-DA3B9572A575),是不會重複,又沒有規則的代號
讓使用者想要猜另一個下載的代號,也無從猜起

這部分依據您自己的需求,斟酌看是否需要修改

^_^
本篇文章回覆於2018-06-13 15:36
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
12樓
作者回應

Jungle
檢舉此回應
感謝喵大的提醒! 也感謝喵大的回覆 讓我解決最大問題

至於這個問題剛剛想了一下,應該是沒什麼問題

因為像喵大上面說的 我有去檢驗說 這個登入者是否能可見這個檔案

如果不可見,即會回傳給使用者一段提醒字串 無觀看權限 的提示

因此這部分也就自然而然就沒問題了!

感謝喵大 感謝各位!
本篇文章回覆於2018-06-13 16:10
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
13樓
回應

WEI
檢舉此回應
感謝喵大 收穫良多!!
本篇文章回覆於2018-06-14 11:52
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.