跳至主要內容
>_ITDITD網站資安平台

資安指南

是否把金鑰檔案遺忘在了公開目錄裡:webroot 盤點

權杖或驗證憑證的檔案,是否被遺忘在了 Web 公開目錄(webroot)裡?直接存取 URL 任何人都能取走——這種典型失誤,再加上源自共用範本、讓所有站點都帶上同一個洞的橫向擴散陷阱,以及盤點自己伺服器並把洞堵上的步驟,本站從維運視角為你講解。

發布於 2026-06-11 更新於 2026-06-11 閱讀時間 2 分鐘

適用對象:在虛擬主機/共用伺服器或 VPS 上,把多個站點部署到公開目錄(public/public_html/htdocs/ 等)來維運的人。這裡不講攻擊手法,只講盤點自己的伺服器並把洞堵上.env 本身的防護方法,另請參閱 共用伺服器上的 .env 保護

本站的視角:『放在哪裡』本身就是存取控制

金鑰外洩的原因,比起高深的攻擊,更多是放錯位置的事故。webroot 是『任何人都能透過 URL 來取的地方』。一旦把金鑰放進那裡,伺服器的密碼再強也毫無意義。本站以金鑰既不放進 webroot 也不放進 git 作為根基(→ 金鑰的安全保管)。思路很簡單:「公開目錄=公開貨架」。貨架上只放被人看到也無所謂的東西。

public/ = 任何人都可透過 URL 取走

可以放

圖片·CSS·JS 等公開資源

不要放

.env·token.json·.sql·.git·.bak

應用程式根目錄之上 = 不會被散發

放在這裡

金鑰·權杖·驗證憑證·備份。權限 600(僅擁有者可讀)。無法從 URL 到達。

公開目錄=公開貨架。金鑰放到它之外(不會被散發的地方·權限 600)。

為什麼會發生「公開目錄裡的遺忘」

實際常見的情形是:為圖方便而放的檔案,或是樣板裡一開始就帶著的檔案,就這樣被持續公開下去。

一發 URL
webroot 裡的檔案任何人都能取走
以年計
容易在無人察覺中被放任
全部站點
源自範本的會橫向擴散
立即撤銷
外洩了就按『已外洩』來處理

例如,為對接外部服務而製作的含存取權杖的 JSON,被放在 public/ 之下並長期擱置——而且如果它源自共用範本,同一個檔案會被複製到多個站點的同一位置,全部都帶著同一個洞。即便修好了一個站點,只要其他站點還開著,也毫無意義。同樣危險的,還有 .env、資料庫備份(.sql)、.git 目錄、編輯器備份(*.bak)、捷徑等的遺忘(相關:路徑穿越·.env 被整個公開的事)。

盤點自己的伺服器

首先機械地排查「自己的公開目錄裡有沒有看起來像金鑰的檔案」。這是對自己資產的排查,而不是窺探他人站點的行為。

1

搜尋公開目錄之下看似金鑰的檔案

在自己的 home 之下,排查混入 public/ 等處的金鑰候選(權杖/驗證憑證的 JSON、.env、金鑰、捷徑)。
2

以橫向擴散為前提擴展到『全機·全站點』

源自同一樣板的站點,要以同一位置存在同一檔案為前提,對全部主機、全部站點施加同樣的排查。一件只是冰山一角。
3

逐一判斷是否真的需要公開

把找出的檔案甄別為『可以公開的東西』還是『金鑰』。若是金鑰,按下一節的步驟移除·撤銷·遷移。
# 盤點自己伺服器的公開目錄之下(對自己資產的排查)
find ~ -path '*/public/*' \( -iname '*token*.json' -o -iname '*credential*.json' \
      -o -iname '*.bak' -o -iname '*.sql' -o -iname '.env*' \) 2>/dev/null
# .git 目錄被公開同樣危險
find ~ -path '*/public/*/.git' -maxdepth 8 2>/dev/null

發現時的處理

發現後,要把移除·撤銷·遷移這三點成套執行。缺少任何一點都堵不徹底。

1

從 webroot 移除,使其無法透過 URL 取走

把相關檔案移到公開目錄之外或刪除,並確認存取 URL 會回傳 404。
2

可能已外洩的金鑰·權杖要撤銷/重新簽發

不要以『大概沒事』為由留著。既然曾經暴露,就按已外洩來處理,更新或撤銷相關權杖·金鑰。
3

把金鑰放到 webroot 之外+權限 600

今後把金鑰放在公開目錄之外(應用程式根目錄之上等),並把權限設為 600(僅擁有者可讀)。若設定中可以拒絕散發敏感副檔名,則一併使用。

容易犯的放置方式(危險)

  • 把對接用權杖的 JSON 放進 public/
  • 把樣板裡帶著的金鑰檔案就這樣公開
  • 把備份(.sql/.bak)或 .git 放任在公開目錄之下
  • 只修一個站點就『處理完畢』

正確的放置方式

  • 公開目錄裡只放可以公開的東西
  • 金鑰放在 webroot 之外+權限 600
  • 敏感副檔名拒絕散發(在設定中 deny)
  • 一處發現就盤點全機·全站點

把『只放可以公開的東西』定為維運規則

比起逐個因應,把它規則化更有效。把公開目錄=公開貨架定下來,金鑰·備份·版本管理資料(.git)·設定檔原則上都不放在那裡。更新樣板(範本)時,要從樣板側抽掉金鑰——否則,同一個洞會繼續被複製到下次批次生產的站點裡。

本站是怎麼做的

本站以金鑰(金鑰·權杖·連線資訊)既不放進公開目錄也不放進程式碼儲存庫作為根基。納入部署產物的只有建置完成的公開資源,金鑰則作為執行環境的環境變數,保存在不會被散發的地方。理由是,本文這一類事故是「一處遺忘,一發 URL 全部外洩」的典型。我們把放置位置本身設計成存取控制,並把盤點與 漏洞因應的盤點 放在同一時機一起做。

接下來閱讀

FAQ

Q把檔案放在公開目錄裡有什麼危險?
A

放進 Web 公開目錄(webroot=public/ 或 public_html/ 等)的檔案,只要直接存取 URL 任何人都能取走。權杖、驗證憑證的 JSON、.env、備份、金鑰檔案等一旦遺忘在那裡,會在無人察覺之間被取走,立刻演變成實害。原則是:公開目錄裡只放『可以公開的東西』。

Q如果在一個站點發現了,是否應該排查其他站點?
A

應該。當你用共用範本或樣板批次生產站點時,同樣的遺忘往往已經橫向擴散到了所有站點。一處發現,就要對源自同一範本的全部站點、全部主機一併排查。

Q發現之後該如何處理?
A

①把相關檔案從 webroot 移除,使其無法透過 URL 取走(變成 404);②可能已外洩的權杖、金鑰要更新/撤銷(按已外洩來處理);③今後把金鑰放在 webroot 之外,並把權限設為 600(僅擁有者可讀)。這三點要成套執行。