~/VibeHandbook
PDF miễn phí

Chương 18 · 03

Secret và API key: cái bẫy lộ khóa

Một là bất cứ thứ gì cấp quyền truy cập: (Application Programming Interface, giao diện lập trình ứng dụng) key, mật khẩu cơ sở dữ liệu, của nhà cung cấp thanh toán, khóa ký (signing key). Sai lầm phổ biến nhất — và đắt giá nhất — trong vibe coding là để lộ một trong số đó.

Có hai cái bẫy liên tục bắt gọn người ta:

  • Secret nằm trong mã phía client. Bất cứ thứ gì trong của bạn (mã JavaScript chạy trong trình duyệt) đều là công khai. Người dùng có thể mở dev tools và đọc nó. AI, khi được yêu cầu gọi một API từ một React component, sẽ sẵn lòng dán secret key của bạn ngay tại đó — và giờ ai truy cập trang web của bạn cũng có thể sao chép nó và làm hóa đơn của bạn tăng vọt. Secret key thuộc về phía server, không bao giờ nằm trong mã được gửi tới trình duyệt.
  • Secret nằm trong repo. Một key được viết cứng (hardcode) trong file sẽ bị vào . Ngay cả khi bạn xóa nó sau đó, nó vẫn tồn tại mãi mãi trong lịch sử git, và các bot quét các repo công khai để tìm chính xác thứ này chỉ trong vài phút sau khi push.

Nơi ở đúng đắn cho một secret là một biến môi trường () — một giá trị được cung cấp cho ứng dụng lúc chạy (runtime), giữ hoàn toàn tách khỏi mã nguồn:

// VULNERABLE: key is in the source, will be committed to git
const stripe = new Stripe("sk_live_51H8xQ2eZvK...");

// SAFE: key is read from the environment, never written in code
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY);

Một secret chỉ có đúng một nơi ở an toàn — phía server, đọc từ môi trường. Trình duyệt là nơi công khai: bất cứ thứ gì được gửi tới đó đều có thể bị bất kỳ ai mở dev tools đọc được.

            ┌──────────────────────────────────────────┐
            │  .env  (gitignored, never committed)      │
            │  STRIPE_SECRET_KEY=sk_live_...            │
            └───────────────────┬──────────────────────┘
                                │ injected at runtime
                                ▼
   ┌──────────────────────┐          ┌──────────────────────┐
   │   SERVER             │          │   BROWSER (client)    │
   │   process.env.KEY ✓  │   ✗──────│   anyone can read     │
   │   calls Stripe here  │  NEVER   │   dev tools · "view   │
   │                      │  send    │   source" · network   │
   └──────────────────────┘  here    └──────────────────────┘
        safe: stays private              public: = leaked

Hãy thêm .env (và .env.local, v.v.) vào .gitignore của bạn trước khi bạn viết bất kỳ secret nào. Nếu một key nào đó lỡ lọt vào mã hay lịch sử của bạn, hãy coi như nó đã "cháy": xoay vòng nó (rotate — tạo một key mới và thu hồi key cũ) — chỉ xóa dòng đó thôi là không đủ, vì key cũ vẫn còn hiệu lực và vẫn còn ngoài kia.

Muốn bản ngoại tuyến?

Tải trọn cuốn sách dưới dạng PDF hoặc EPUB — miễn phí.