隱藏檔案網址路逕的下載


Tek 發表



讓檔案沒有一個真正的網址路逕,卻可以下載的做法

這一篇文章將會配合 ASP.Net 語言做出讓使用者下載檔案卻無法找出網路路逕的做法• ASP 學習者這一次可能無法完全吸收這一個教學內容,因為 ASP.Net 與 ASP 在這邊的寫法會有點不大一樣• 如果您正困擾者該如何管制或監控每一個下載檔案的話,Read on!

為什麼要經過網頁來下載檔案

您是否有過自己網站的檔案被其他人隨便貼連結位置盜連的情況呢? 或者您困擾該如何追蹤每一個使用者從您網站所下載的檔案? 還是您只是純粹想要邊讓瀏覽者下載,邊隱藏該檔案的真正位置? 其實先經過一個網頁處理才開始下載的動作是較安全的做法,您不但可以很清楚的追蹤檔案... 也可以在這個開放的網路世界裡控制自己網站的會員哪一個是可以下載的檔案,哪一個是不行的• 其他更特並的,這也可以是防止專門針對檔案要求而攻擊的 DDOS Attack 措施之一!

該怎麼讓瀏覽器下載檔案

要讓瀏覽器下載檔案,您可以用後端語言(Server-Side),或者Client-Side Scripting... 例如: JavaScript + ActiveX 或者 VBScript + ActiveX• 不過在這邊,我們只講用 ASP.Net 搭配的方法• 首先您必須要給予一個正確的Content Type,或稱MIME (Multipurpose Internet Mail Extensions),讓瀏覽器去判斷成這是該被下載的檔案• 此 content type 為application/save-as... 而要在 ASP.Net 變更content type 的話,寫法如下:

Response.ContentType = "application/save-as"

當您的aspx文件有這一行程式碼時,您的瀏覽器就會準備要下載這一個文件... 所以,當要下載時,您會看到你要下載的是 *.aspx 文件• 但假如我們要下載的是 *.txt 文件,那寫著 *.aspx 不是美中不足嗎? 其實這是可以修改的,只要增加一個HTTP Header 就可以了,ASP.Net 的寫法如下:

Response.AddHeader("content-disposition", ""attachment; filename=test.txt")

把這兩行放在一起,我們就可以順利寫出讓瀏覽器下載任何檔案的程式了:

<Script Language="VB" Runat="Server">
Sub Page_Load()
With Response
.ContentType = "application/save-as"
.AddHeader("content-disposition", "attachment; filename=world.txt")
.Write("The whole world loves ya!")
.Flush
End With
End Sub
</Script>

隱藏檔案位置的下載方法

要隱藏檔案位置的話,我們可以在此先假設我們有這些環境:

•所有可以被下載的檔案放在 NTFS 檔案系統的 C:\shares\ 下
•World Wide Web Root 的目錄在於 C:\inetpub\wwwroot\
•處理使用者下載的網頁在於 C:\inetpub\wwwroot\download.aspx
•測試的環境主機位置是 127.0.0.1

一個基本要隱藏檔案位置的條件差不多這樣就行了! 我想大家都知道,在wwwroot\ 目錄下每一個檔案都是可以被下載的... 所以,這一個隱藏檔案的做法是: 把要下載的檔案放在 wwwroot 以外的地方,讓使用者下載不到• 但卻可以另外透過你的網頁處理並傳送給他們• 也就是說,這一個網頁是每一個想要下載的使用必經的關卡•

這是一個很基本的例子,我們不會檢查使用者的身份或其他動作• 只會讓程式去判斷有沒有該使用者要求的檔案在 C:\shares\ 目錄下,如果有則傳,如果沒有則寫 "無檔案"• 這是 download.aspx 的程式碼:

<Script Language="VB" Runat="Server">
Sub Page_Load()
Dim default_file_root As String = "C:\shares\"
Dim user_request As String = Request.QueryString("filename")
If user_request <> "" Then
Dim filep As String = default_file_root & user_request
If System.IO.File.Exists(filep) Then
With Response
.ContentType = "application/save-as"
.AddHeader("content-disposition", "attachment; filename=" & user_request)
.WriteFile(filep)
End With
Else
Response.Write("無檔案")
End If
End If
End Sub
</Script>

假設有一個使用這要下載叫做 tek.exe 的檔案,他/她必須在瀏覽器中輸入這一個URL (一個要求):

http://127.0.0.1/download.aspx?filename=tek.exe

然後,如果download.aspx 找到了這一個檔案,就會開始下載•

很簡單吧? 幾行程式碼就可以完成 "不可能的任務" 了! 如果您還沒看懂為什麼這樣就能"隱藏"網址路逕的話,讓我再給你幾個重點吧:

•把供下載的檔案放在虛擬目錄以外的地方,讓人下載不到 (因為虛擬目錄以外的地方不是伺服器軟體可處理的範圍)
•建立一個網頁媒介,讓該網頁去尋找並處理可供下載的檔案 (唯一的下載媒介)

我還能對我的檔案做什麼

• 監視各檔案下載/要求流量
• 記錄下載 (Log)
• 檔案控制下載, 如: 身份控制下載
• 下載流量控制處理
• 其他安全性保護

網路資源

這些是大家在閱讀時可能會想要看的資料:

MIME 介紹(英):
http://www.faqs.org/rfcs/rfc1521.html

關於 content-disposition 的header:
http://www.faqs.org/rfcs/rfc1806.html

ASP.Net 的 HTTPResponse Class members:
http://msdn.microsoft.com/library/en-us/cpref/html/frlrfsystemwebhttpresponsememberstopic.asp?frame=true

最後更新日期: 8/30/2003 10:05:16 PM