起因
前幾天給博客加了後臺管理功能,新增了 SQLite 數據庫目錄 Mdata 和緩存目錄 Mcache。功能跑通之後,一個念頭突然冒出來:
如果我直接訪問 https://域名/Mdata/content.db,會發生什麼?試了一下,瀏覽器開始下載一個文件——數據庫文件被完整暴露了。裏面裝着所有文章內容、用戶密碼哈希、翻譯緩存,一旦被爬蟲或路人下載走,整個站就成了透明玻璃房。
這篇文章記錄一下排查和修復的過程,也給後來者一個參考。
一、先確認到底暴沒暴露
不要憑直覺,先測。用 curl 或瀏覽器逐個訪問:
curl -I https://你的域名/Mdata/content.db curl -I https://你的域名/Mcache/_config.php curl -I https://你的域名/Mdata/views.log curl -I https://你的域名/Mdata/content.db-wal
看返回的 HTTP 狀態碼:
返回碼 含義 200 OK 危險,文件被公開下載 403 Forbidden 被拒絕,但暴露了路徑存在 404 Not Found 理想結果,跟不存在一樣 如果是 200,事情就得處理了。
二、爲什麼寶塔默認擋不住
寶塔面板的默認 Nginx 配置裏,PHP 處理規則長這樣:
location ~ \.php$ {
fastcgi_pass unix:/tmp/php-cgi-74.sock;
include fastcgi.conf;
}
它只管 .php 文件,其他擴展名(.db、.log、.lock)會走靜態文件規則,直接被 Nginx 當普通文件吐給用戶。所以 content.db 就這樣裸奔了。
有人會想:那把 .db 加到 PHP 規則裏不就行了?不行,那會讓 Nginx 試圖用 PHP 解析二進制文件,結果是亂碼或 500。
正確做法是用一個獨立的前綴匹配規則,把整個目錄掐掉。
三、核心配置
打開寶塔面板 → 網站 → 點擊站點 → 配置文件,找到 server {} 塊,在裏面加入:
# 屏蔽數據與緩存目錄
location ^~ /Mdata/ {
return 404;
}
location ^~ /Mcache/ {
return 404;
}
保存,Nginx 會自動 reload。再測一遍那四個 URL,應該全部返回 404。
就這兩條,問題解決了。
四、加固:擴展到全站
擋掉兩個目錄只是起點。順手加上幾條通用規則,覆蓋更多場景:
# ============ 安全加固 ============
# 屏蔽隱藏文件(放行 .well-known 給證書驗證用)
location ~ /\.(?!well-known) {
return 404;
}
# 屏蔽數據與緩存目錄
location ^~ /Mdata/ {
return 404;
}
location ^~ /Mcache/ {
return 404;
}
# 屏蔽後臺密鑰 / 會話文件
location ~ ^/admin/_(key_.*|auth)\.php$ {
return 404;
}
# 兜底:禁止訪問任何數據庫文件
location ~* \.(db|sqlite|sqlite3|db-wal|db-shm)$ {
return 404;
}
# 禁止訪問日誌 / 鎖文件
location ~* \.(log|lock)$ {
return 404;
}
# 禁止訪問備份 / 臨時 / 配置文件
location ~* \.(bak|old|orig|save|swp|swo|tmp|inc|ini|conf)$ {
return 404;
}
逐條解釋:
- 隱藏文件規則:擋住
.git、.env、.htaccess這類文件。(?!well-known)是負向先行斷言,避免誤傷.well-known(Let's Encrypt 簽發證書用)。 - 目錄屏蔽:Mdata / Mcache 兩個核心目錄。
- 後臺文件屏蔽:
Madmin/_key_*.php裏存着登錄密鑰、_auth.php裏存着會話 token。雖然內容被註釋包裹不會泄露,但多一層是一層。 - 擴展名兜底:萬一哪天你把
Mdata改名成Data、或者有別的目錄裏也有.db,這條規則依然攔得住。 - 日誌/鎖文件:
views.log、views.lock、php_error.log這類文件,內容可能包含 IP、UA、錯誤堆棧。 - 備份/臨時文件:編輯器(vim / VSCode / PHPStorm)會生成
.swp、~、.orig之類,開發者改代碼時忘記刪掉,就會暴露源碼。
六、關於 403 和 404 的哲學
安全圈有一句老話:
不要告訴攻擊者你做錯了什麼。
一個 403 Forbidden 的響應,等價於對掃描器廣播:"這裏有東西,只是我現在不給你。" 攻擊者下一步的動作就是嘗試繞過、猜路徑、找漏洞。
而 404 Not Found 是沉默——"你看到的和我看到的沒什麼不同"。
對自用的小站來說,攻擊者本來也沒那麼"精準打擊",大多是自動化掃描。給個 404,掃描器一般就略過了。