環境變數同 Secrets 係咩?淺白指南
環境變數係一個有名字嘅設定,例如 DATABASE_URL 或者 STRIPE_SECRET_KEY,喺你個應用程式運行時交俾佢,而唔係寫落代碼入面。Secret 係一個必須保密嘅環境變數,例如 API 密鑰、密碼或者簽署密鑰。將呢啲值放喺代碼以外,你就可以唔使改代碼都更換佢哋,測試同真正客戶用唔同嘅值,亦都可以避免你分享或者公開代碼時洩露出去。
用 AI 建構時點解咁重要
一旦你嘅應用程式要同另一個服務做嘢,例如收款、發電郵、調用 AI 模型,就需要用到密鑰。AI 應用程式建構工具經常要求你提供呢啲密鑰,而密鑰最後放喺邊,就決定咗你嘅應用程式安唔安全。
AI 建構嘅應用程式通常有兩樣嘢經常出錯:
- 密鑰被貼入聊天或者代碼。 咁樣佢就會留喺聊天記錄、項目檔案,同任何匯出或者代碼倉庫入面。見到嘅人都可以用你嘅帳戶。
- 密鑰喺瀏覽器入面使用。 如果呼叫 Stripe 或者 OpenAI 嘅代碼喺頁面入面運行,密鑰就會送去每位訪客。真係有人會睇,而且自動掃描器一直都喺搵暴露嘅密鑰。
明白環境變數,你就可以認出呢兩樣問題,亦都可以要求修正。
日常比喻:酒店保險箱
你個應用程式嘅代碼好似酒店房間。賓客(以及清潔人員,以及任何你俾咗門匙卡嘅人)都會行過。你唔會將護照放喺書枱上面。
環境變數就好似房間入面嘅保險箱。房間知道有個保險箱,亦知道需要時點樣打開,但護照並唔係隨便擺住。如果你由測試設定搬去真正嘅網站,你只需要喺嗰個房間嘅保險箱放一本唔同嘅護照,而唔使重新裝修。
運作方式
你嘅代碼係引用一個名字,而唔係一個值。喺伺服器上面嘅 JavaScript,寫法好似 process.env.STRIPE_SECRET_KEY。應用程式啟動時,佢運行嘅平台會將嗰個名字對應嘅值填入。喺平台設定度改咗個值,然後重新啟動或者重新部署,應用程式就會用新嘅值,唔使改代碼。
值嘅來源視乎應用程式喺邊度運行:
| 運行位置 | 值存放喺邊 |
|---|---|
| 開發者嘅手提電腦 | 一個通常叫 .env 嘅本地檔案,絕對唔可以 commit 入 git |
| AI 建構工具嘅預覽 | 項目嘅 secrets 或者設定面板 |
| 託管平台 | 該平台嘅環境變數設定 |
| GitHub Actions 或者其他自動化 | 該服務自己嘅加密 secrets 儲存 |
公開變數定係 secret 變數
唔係每個環境變數都係 secret。可以將佢哋分成兩類:
| 類別 | 例子 | 瀏覽器睇得到嗎? |
|---|---|---|
| 公開設定 | 網站名稱、公開分析 ID、Stripe publishable 密鑰、功能開關 | 睇得到,冇問題 |
| Secret | Stripe secret 密鑰、OpenAI 或 Anthropic API 密鑰、數據庫連接字串、電郵服務密鑰、webhook 簽署密鑰 | 永遠睇唔到 |
網頁框架會明確咁樣分開。Vite 入面,只有以 VITE_ 開頭嘅變數會被放入瀏覽器代碼;Next.js 就用 NEXT_PUBLIC_ 做前綴。咁樣係一種保護設計:凡係有呢啲前綴嘅嘢,最後都會放入每位訪客都會下載嘅檔案,所以 secret 絕對唔可以加呢啲前綴。
實際例子:AI 摘要按鈕
你想要一個「摘要呢則筆記」按鈕,佢會調用 AI 模型。
唔安全嘅做法: 按鈕嘅代碼喺瀏覽器入面運行,直接用寫死喺代碼度嘅 API 密鑰去叫 AI 供應商。喺預覽度會正常運作。但咁樣任何人都可以打開瀏覽器嘅開發者工具,複製個密鑰,然後用你嘅帳戶消費。
安全嘅做法:
- 你喺 AI 供應商嗰度開一條密鑰,然後喺項目設定入面儲存為名叫
OPENAI_API_KEY(或者類似名稱)嘅 secret。 - 後端有一條路由
POST /api/summarise,佢會讀取process.env.OPENAI_API_KEY,檢查用戶有冇登入,然後去叫供應商。 - 按鈕叫嘅係你嘅路由,而唔係供應商。瀏覽器永遠睇唔到密鑰。
- 你喺已發佈應用程式嘅設定度加入同一個 secret,然後重新部署,令正式網站都有呢個值。
呢個模式(瀏覽器叫你嘅伺服器,伺服器持有密鑰再去叫服務)適用於收款、電郵、地圖同所有其他付費 API。使用 LLM API 指南會更深入咁講 AI 嘅情況。
重點名詞
.env檔案: 本地開發用嘅文字檔,每行係名稱=值。喺.gitignore入面列明,咁就唔會被 commit。.env.example: 一份淨係有名稱、冇真正值嘅副本,會 commit,等其他人知道要設定邊啲變數。- 輪換(rotate): 用新嘅 secret 取代舊嘅,並撤銷舊嘅。
- 範圍/權限(scope): 好多供應商容許你開一條只可以做特定嘢嘅密鑰。一條只可以發電郵嘅密鑰,會比一條可以做晒所有嘢嘅密鑰危險性低。
- 測試 vs 正式密鑰: Stripe 等供應商會為測試同真正收款分別提供密鑰。上線之前用測試密鑰。
- 簽署密鑰(signing secret): 用嚟檢查某個訊息(例如 webhook)係咪真係由發送方發出嘅 secret。
常見錯誤同誤解
- 「我個 repository 係私人嘅,所以入面有密鑰冇問題。」 私人 repository 都會被分享、fork、匯出同複製到手提電腦。密鑰依然唔應該放喺嗰度。如果你將項目連接到 GitHub,要確認冇包含
.env檔案。 - 「我已經刪咗,所以冇嘢啦。」 Git 會保留歷史記錄,聊天記錄亦會保留訊息。如果一條密鑰曾經洩露,就要輪換佢。
- 喺 secret 前面加咗公開前綴。
VITE_OPENAI_KEY會將你嘅密鑰放入瀏覽器 bundle。 - 忘記重新部署。 喺設定度改咗變數,通常要等應用程式重新啟動或者再次發佈先會生效。
- 所有嘢都用同一條密鑰。 測試同正式分開,每個應用程式各用一條,咁樣就可以撤銷其中一條,而唔會影響其他嘅。
- 冇消費上限。 對於付費 API,喺供應商嘅後台設定預算或者上限,以防密鑰洩露。
向你嘅 AI 建構工具要求咩
- 「由名叫
STRIPE_SECRET_KEY嘅環境變數讀取 Stripe secret 密鑰。只喺伺服器使用。」 - 「確保冇任何 secret 用喺客戶端代碼,亦冇俾佢加
VITE_/NEXT_PUBLIC_前綴。」 - 「建立一個
.env.example,列出應用程式需要嘅每個變數,但唔好有值,並確保.env被 git 忽略。」 - 「檢查已建構嘅前端檔案,睇有冇任何似 API 密鑰嘅字串。」
我哋嘅 AI 建構應用程式安全檢查清單 會同其他上線前要檢查嘅項目一齊講 secrets。
Mythex 上嘅 Secrets
喺 Mythex,secrets 係項目嘅環境變數,會注入預覽沙盒同你已發佈嘅應用程式。你可以喺 項目設定 → Secrets 度加入,或者喺聊天入面用 /secrets。當 agent 需要密鑰時,會喺聊天中顯示一張 secrets 卡,所以個值會輸入到表單欄位,而唔會留喺訊息紀錄入面。如果你改咗正式應用程式嘅 secret,要重新發佈,部署先會用到新值。項目匯出會剔除 secrets,匯入嘅 .env 檔案會被清走,你要喺設定度重新加入。詳情請睇文件嘅環境變數同 secrets,以及聊天中嘅 secrets。
常見問題
什麼係環境變數?
環境變數係一個有名字嘅設定,例如 STRIPE_SECRET_KEY 或者 DATABASE_URL,喺程式運行時交俾佢,而唔係寫死喺代碼入面。咁樣同一套代碼就可以喺開發同正式環境用唔同嘅值。
環境變數同 secret 有咩分別?
Secret 係一個值必須保密嘅環境變數,例如 API 密鑰、數據庫密碼或者 webhook 簽署密鑰。其他環境變數,例如網站名稱或者功能開關,就可以公開。
喺前端放 API 密鑰安全嗎?
唔安全。前端代碼會被下載到每位訪客嘅瀏覽器,任何人都睇得到。Secret 密鑰只可以喺伺服器用,瀏覽器應該叫你嘅伺服器,再由伺服器去叫服務供應商。
如果我嘅 API 密鑰洩露咗點算?
即刻喺供應商嗰度撤銷或者更換,開一條新嘅,再更新你應用程式儲存 secret 嘅地方,然後重新部署。只係喺代碼或者聊天記錄度刪走佢係唔夠嘅,因為可能已經有副本。