威脅模型
ASP + Access 架構中,資料庫檔案 (`.mdb`) 若置於 Web 根目錄下,攻擊者可直接透過 HTTP 下載,導致完整資料外洩。本文提供九層防禦策略,建議組合使用。
策略一:不可預測的檔案名稱
使用 GUID、雜湊值或長隨機字串命名 (如 `a7f3k9x2.mdb`),並在連線字串中對應。
缺點: 僅靠隱匿性,一旦路徑洩露 (錯誤訊息、原始碼、備份檔) 即失效。
策略二:副檔名偽裝為 .asp/.asa + 內嵌 ASP 標記
- 將 `.mdb` 改名為 `.asp` (如 `data.asp`)。
- 在 Access 中新增 OLE 物件欄位,插入一個內容為 `<%` 的文字檔 (需用記事本建立檔案 → Access「插入物件」→「從檔案建立」)。
- IIS 解析 `.asp` 時遇到 `<%` 會嘗試執行,拋出 500 錯誤,阻斷下載。
原理: Access 文字欄位會 HTML 編碼 `<%` 為 `<%` 失效,唯有 OLE 物件保留原始二進位內容。
策略三:檔名前綴 `#` 或內嵌空格
- 命名為 `#data.mdb` 或 `data 1.mdb`。
- HTTP 請求中 `#` 後內容為片段識別碼不會傳送至伺服器;空格會被 URL 編碼為 `%20`,導致實體路徑不匹配。
缺點: 部份下載工具/瀏覽器行為不一,非絕對可靠。
策略四:資料庫級加密 + 密碼保護
- 工具 → 安全性 → 加密/解密資料庫 → 另存為加密版本。
- 以「獨佔模式」開啟加密版本 → 工具 → 安全性 → 設定資料庫密碼。
連線字串更新:Provider=Microsoft.Jet.OLEDB.4.0;Data Source=...;Jet OLEDB:Database Password=YourPwd;
警告: Jet/ACE 加密演算法較弱 (XOR 為基礎),專用工具可在秒級破解,**不可作為唯一防線**。
策略五:將資料庫移至 Web 根目錄之外
最有效、最標準的做法。 實體檔案放在 `C:\AppData\Databases\` 等非公開路徑,連線字串使用絕對路徑或 `Server.MapPath("../data/db.mdb")`。
IIS 無法直接透過 URL 存取,徹底斷開下載路徑。
策略六:IIS 處理對應映射封鎖 .mdb 下載
- IIS 管理員 → 網站 → 處理對應 → 新增 `.mdb` 對應至 `C:\Windows\System32\inetsrv\404.dll` (或自訂 ISAPI 回傳 404/403)。
- 或在 `web.config` (ASP.NET) 設定 ``。
策略七:NTFS 權限最小化
- 資料庫檔案 ACL 僅授予:
— SQL Server 服務帳號 (若用 SQL Server 掛載)
— 應用程式集區身分識別 (ApplicationPoolIdentity)
— 管理員群組
明確拒絕 `IUSR`、`Everyone`、`Authenticated Users`。
策略八:遷移至 SQL Server Express / LocalDB
Access 為檔案型資料庫,本質上難以在 Web 環境安全部署。遷移至 SQL Server Express (免費)、LocalDB (輕量) 或 Azure SQL,獲得:
— 服務型架構,無檔案直連風險
— 完整權限模型、稽核、加密 (TDE、Always Encrypted)
— 並發效能、備份/還原/高可用
策略九:定期稽核與滲透測試
- 掃描網站目錄確認無 `.mdb`、`.accdb`、`.bak` 暴露。
- 使用工具 (OWASP ZAP、Nikto) 檢測敏感檔案洩露。
- 代碼審查確認連線字串未硬編碼在前端/JS/備註中。
防禦等級總結
| 等級 | 措施 | 有效性 | 維護成本 |
| 基礎 | 策略 1-3 (偽裝) | 低 | 低 |
| 中等 | 策略 4 (加密) + 6 (IIS 封鎖) | 中 | 中 |
| 高 | 策略 5 (移出 Web 根目錄) + 7 (NTFS) | 高 | 低 |
| 最佳 | 策略 8 (遷移 SQL Server) + 9 (稽核) | 極高 | 中 (一次性遷移成本) |