~/VibeHandbook
免費 PDF

18 · 03

金鑰與 API key:金鑰外洩陷阱

金鑰是任何能授予訪問許可權的東西:(Application Programming Interface,應用程式程式設計介面)key、資料庫密碼、支付服務商令牌、簽名金鑰。vibe coding 裡最常見——也最昂貴——的錯誤,就是洩露其中之一。

有兩個陷阱不斷地坑住人:

  • 客戶端程式碼裡的金鑰。 你前端裡的任何東西(在瀏覽器裡執行的那段 JavaScript)都是公開的。使用者可以開啟開發者工具直接讀到它。AI 在被要求從 React 元件裡呼叫一個 API 時,會樂呵呵地把你的金鑰直接粘在那兒——於是現在任何訪問你網站的人都能把它複製走、把你的賬單刷爆。金鑰應該待在伺服器上,永遠不要出現在會發送到瀏覽器的程式碼裡。
  • 倉庫裡的金鑰。 硬編碼在檔案裡的金鑰會被提交進 。就算你之後刪掉它,它也會永遠留在 git 歷史裡,而機器人會在你 push 後幾分鐘內就掃描公開倉庫,找的正是這種東西。

金鑰正確的歸宿是環境變數(environment variable)——一個在執行時提供給應用的值,完全不寫進程式碼裡:

// VULNERABLE: key 在原始碼裡,會被提交進 git
const stripe = new Stripe("sk_live_51H8xQ2eZvK...");

// SAFE: key 從環境中讀取,從不寫在程式碼裡
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY);

金鑰只有一個安全的家——在伺服器端,從環境裡讀取。瀏覽器是公共場所:任何被送到那裡的東西,任何開啟開發者工具的人都能讀到。

            ┌──────────────────────────────────────────┐
            │  .env  (gitignore忽略・永不提交)          │
            │  STRIPE_SECRET_KEY=sk_live_...            │
            └───────────────────┬──────────────────────┘
                                 │ 執行時注入        
                                ▼
   ┌──────────────────────┐          ┌──────────────────────┐
   │   SERVER             │          │   BROWSER (客戶端)    │
   │   process.env.KEY ✓  │   ✗──────│   任何人都可讀        │
   │   在此呼叫Stripe     │  絕不    │   dev tools · "view   │
   │                      │  傳送    │   source" · network   │
   └──────────────────────┘  到此    └──────────────────────┘
        安全: 保持私密                   公開: = 洩露    

在你寫下第一個金鑰之前,就把 .env(以及 .env.local 等等)加進你的 .gitignore。如果某個金鑰確實進了你的程式碼或歷史,就把它當成已經燒掉了:輪換它(生成一個新的並吊銷舊的)——刪掉那一行是不夠的,因為舊金鑰依然有效,而且依然在外面流傳著。

想離線閱讀?

免費下載整本書的 PDF 或 EPUB。