有很多時候我們會在網站上存放重要資料檔案,例如: 相關設定XML、執行過程產生的文字檔,甚至是mdf資料庫檔。原則上這些檔案可放在網站的任何目錄結構下,我們可利用Serer.MapPath()輕鬆算出其實體路徑,當成讀、寫檔案時的參數。

不過,檔案隨便亂擺會有潛在風險,一些僅供程式內部使用的檔案,很多內容是見不得人的或跟資安管控息息相關(例如: 記錄可存取Client IP清單的XML、記載特殊存取事件的Log檔... 等等),當我們將檔案放在一般網站資料夾下,使用者只要組裝出完整URL,就可以用瀏覽器光明正大,輕輕鬆鬆把你的機密檔案帶回去把玩。

ASP.NET 2.0起,增加了App_Data機制,允許我們在網站新增一個名為App_Data的特殊資料夾:

這個特殊資料夾有個特性,放在其中的檔案,程式可以自由讀取,但使用者是完全看不到的,即不可能在URL輸入App_Data透過瀏覽器直接存取檔案。換句話說,這個目錄下的檔案只允許用程式碼存取,禁止使用者以瀏覽器直接讀取。這樣子,我們就可以確保其中的資料不會被使用者任意下載回家。另外,當App_Data應用在web.config中指定ConnectionString時,可使用|DataDirectory|代替,使用Access或SQL Express時頗為方便。

大家在規劃網站檔案儲存位置時,記得善用這個會隱身術的資料夾,提高網站安全。不過要留意,App_Data所能防範的僅僅是使用者透過URL取回資料,如果資料的敏感性高到需要更嚴密保護時(例如: 客戶個資、信用卡資料),仍需要另外更進一步的安全機制防堵檔案系統遭入侵時的風險。


Comments

# by psplay

謝謝黑大的提醒唷!! 很實用的技巧!!

# by Amos

感謝大大: 找了好久,終於解決我相對路徑的問題!!! 實在太感謝你了~~

# by Leslie

黑大 你好: 如果我把網頁程式放到網路磁碟裡,app_data 的路行該如何處理,使用|DataDirectory|似乎會抓到 C槽…

# by Jeffrey

to Leslie,依據文件 https://learn.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlconnection.connectionstring?view=dotnet-plat-ext-8.0&redirectedfrom=MSDN#System_Data_SqlClient_SqlConnection_ConnectionString DataDirectory 不支援 UNC 這類網路磁碟機做法 If DataDirectory is used, the database file must exist within a subdirectory of the directory pointed to by the substitution string. Note: Remote server, HTTP, and UNC path names are not supported.

Post a comment