.env 非常方便,幾乎所有現代框架都會用它。但只要存放位置弄錯一處,就等於把網站的一整串鑰匙貼在大門上。本文從零開始講解它的含義和防護方法。
再講細一點
應用程式裡有「隨環境而變的值」和「不想給人看到的值」。比如資料庫密碼、外部服務的 API key、用來加密工作階段的金鑰等。如果把這些直接寫死在原始碼裡,一旦共享程式碼,祕密也會跟著一起外洩。
於是,把這些集中到 .env 這一個檔案裡,程式碼則以「環境變數」的形式讀取它們。Next.js、Laravel、Rails 等許多框架都採用這種方式。
為什麼是「最危險的檔案」
.env 在一個檔案裡匯集了多把鑰匙,所以這裡一旦外洩,損害就會一下子擴散開來。把每把鑰匙「外洩後會發生什麼」並列出來,就能看出有多嚴重。
| 外洩的值 | 會發生什麼 |
|---|---|
| 資料庫認證資訊 | 資料被讀取、竄改、全部刪除 |
| 外部 API key | 被冒名使用、違規扣費 |
加密金鑰(如 Laravel APP_KEY、簽章金鑰) | 工作階段偽造、冒名登入 |
| OAuth 機密 | 關聯應用程式被接管 |
事實上,.env 被公開是事故的經典戲碼。→ .env 曾向全世界公開的故事
外洩的典型模式=存放位置的失誤
最大的原因是「把應用程式本體整個放進公開目錄(docroot)」。本該只暴露 public/,結果卻公開了它的上層目錄,連 .env 都能被取到。
✗ 危險(本體直接放在公開根目錄下)
public_html/ ├─ .env ← 能被讀到! ├─ app/ └─ public/
✓ 安全(本體在外,只公開 public)
app-root/ ├─ .env ← 無法到達 ├─ app/ └─ public_html/ → public/
防護方法
不要放進公開目錄
應用程式本體放在 docroot 之外,公開的只有 public/ 等。在虛擬主機上的具體步驟見 這篇文章。
不要提交到 git
在 .gitignore 裡加入 .env*,只共享把值留空的 .env.example。
外洩後全部輪替
不只是能確認到的那一個,而要把 .env 裡的鑰匙全部更換。按照已被看到的前提來行動。
定期自查
養成確認自己網站上 /.env 是否能被打開的習慣。
自查(僅限你自己擁有的網域)
# 回傳 200 且有正文就說明已公開。403/404 則暫時沒問題
curl -sI https://你的網域/.env | head -1
curl -sI https://你的網域/.git/config | head -1養成每次發布都做一次這項確認的習慣,就能及早發現存放位置的失誤。
接下來讀
FAQ
Q.env 可以提交到 git 嗎?
不可以。務必把 .env 加入 .gitignore。作為替代,只提交把值留空的 .env.example,用來共享「需要哪些 key」。
Q.env 哪怕只外洩了一個,要更換什麼?
不僅是能確認到的那一個,而要把 .env 裡的鑰匙全部輪替。優先順序是「外部 API、OAuth 機密 → 加密金鑰 → 郵件 → 資料庫」。按照已被看到的前提來行動才安全。
Q怎麼確認 .env 是否外洩了?
用瀏覽器打開自己網站的 https://你的網域/.env,如果內容被顯示出來,就說明已經公開了(回傳 200 且能看到正文就出事了)。如果沒顯示而是 403/404,那暫時沒問題。