Cách giữ an toàn API key trong ứng dụng của bạn
Để giữ an toàn API key, hãy lưu chúng dưới dạng secret hoặc biến môi trường trên máy chủ lưu trữ, chỉ dùng trong mã phía máy chủ, và không bao giờ dán chúng vào chat, tệp mã, ảnh chụp màn hình hay repository Git. Cấp cho mỗi key quyền tối thiểu mà nó cần, đặt giới hạn chi tiêu tại nhà cung cấp, và nếu một key bị rò rỉ, hãy thay nó — tạo key mới rồi xóa key cũ — thay vì chỉ giấu nơi nó đã xuất hiện.
API key là mật khẩu của một dịch vụ. Key OpenAI của bạn cho phép ai đó tiêu tiền của bạn vào AI; secret key Stripe cho phép ai đó hoàn tiền; key nhà cung cấp email cho phép ai đó gửi thư dưới tên bạn. Các trình xây dựng ứng dụng AI rất giỏi trong việc kết nối những key này nhưng không phải lúc nào cũng cẩn thận về nơi chúng được đưa tới, nên hướng dẫn này bao gồm cách giữ chúng an toàn và cách kiểm tra.
Khóa công khai và khóa bí mật
Không phải key nào cũng là bí mật. Biết sự khác biệt giúp bạn không hoảng loạn vì key sai và bỏ qua key đúng.
| Loại | Ví dụ | Có thể nằm trong trình duyệt không? |
|---|---|---|
| Khóa công khai / publishable | Key pk_… của Stripe, key bản đồ được giới hạn theo tên miền, một số ID phân tích | Có — được thiết kế cho điều đó |
| Secret key | sk_… của Stripe, key OpenAI và Anthropic, key nhà cung cấp email, mật khẩu cơ sở dữ liệu | Không bao giờ |
| Key dịch vụ/quản trị | Các key vượt qua quy tắc truy cập trên cơ sở dữ liệu được lưu trữ | Không bao giờ — coi là nhạy cảm nhất |
Nếu bạn không chắc một key thuộc loại nào, hãy kiểm tra tài liệu của nhà cung cấp. Khi nghi ngờ, hãy coi nó là bí mật.
Bước 1: Lưu key dưới dạng secret, không đặt trong mã
Key thuộc về biến môi trường hoặc phần cài đặt secrets của máy chủ lưu trữ. Mã của bạn đọc chúng theo tên khi chạy (ví dụ process.env.OPENAI_API_KEY), nên giá trị không bao giờ xuất hiện trong tệp của bạn. Để hiểu thêm, xem biến môi trường và secret là gì.
Chuyển mọi API key ra khỏi mã và đưa vào biến môi trường. Liệt kê từng key bạn tìm thấy, nó nằm trong tệp nào, và tên biến bạn đã dùng. Đừng hiển thị giá trị.
Sau đó kiểm tra không còn sót lại gì:
Tìm trong toàn bộ dự án, bao gồm các tệp cấu hình và mọi tệp .env, bất cứ thứ gì trông giống API key hoặc mật khẩu. Báo cáo tệp và dòng, không báo giá trị.
Bước 2: Chỉ dùng secret key trên máy chủ
Đây là quy tắc quan trọng nhất. Bất cứ thứ gì trình duyệt nhận được, một khách truy cập đều có thể đọc — mã nguồn trang và các tệp JavaScript đều hiển thị trong công cụ dành cho nhà phát triển.
Vì vậy, nếu ứng dụng cần gọi OpenAI, trình duyệt nên gọi máy chủ của bạn, và máy chủ của bạn gọi OpenAI bằng key. Key không bao giờ rời khỏi máy chủ.
Tính năng chat hiện gọi OpenAI trực tiếp từ trình duyệt. Hãy chuyển lệnh gọi đó sang một route API phía máy chủ đọc OPENAI_API_KEY từ môi trường. Trình duyệt chỉ nên gọi route của chúng ta. Yêu cầu đăng nhập cho route này.
Hãy chú ý một cạm bẫy phổ biến trong các framework frontend: các biến có tiền tố công khai — VITE_ trong Vite, NEXT_PUBLIC_ trong Next.js — được đưa vào mã trình duyệt có chủ đích. Một secret key có một trong những tiền tố đó sẽ bị lộ, dù nó "nằm trong biến môi trường".
Bước 3: Kiểm tra xem có gì bị rò rỉ không
Đừng tin rằng mọi thứ đã đúng — hãy kiểm tra website đang chạy:
- Mở ứng dụng đã xuất bản trong trình duyệt.
- Mở công cụ dành cho nhà phát triển, rồi tab Sources hoặc Network.
- Tìm trong tất cả các tệp các ký tự đầu của mỗi secret key (ví dụ
sk_hoặcsk-). - Kiểm tra các yêu cầu mạng mà ứng dụng gửi. Một yêu cầu đi thẳng từ trình duyệt tới nhà cung cấp AI trả phí là dấu hiệu cảnh báo.
Nếu bạn tìm thấy một secret key, hãy chuyển nó lên máy chủ (bước 2) và thay mới (bước 6), vì nó đã công khai rồi.
Bước 4: Giới hạn mỗi key có thể làm gì
Nhiều nhà cung cấp cho phép bạn giới hạn key:
- Key có phạm vi hoặc bị hạn chế chỉ làm được những gì ứng dụng cần. Ví dụ, Stripe hỗ trợ key hạn chế với các quyền cụ thể.
- Giới hạn theo tên miền hoặc IP cho những key bắt buộc phải công khai, như key bản đồ.
- Key riêng cho mỗi ứng dụng và mỗi môi trường, để một lần rò rỉ không làm lộ tất cả, và việc thu hồi một key không làm hỏng các key khác.
- Key thử nghiệm khi đang xây dựng, và key thật chỉ dùng trong ứng dụng đã xuất bản.
Bước 5: Đặt trần cho thiệt hại
Ngay cả một key được bảo vệ tốt vẫn có thể bị lạm dụng thông qua chính ứng dụng của bạn — ví dụ, ai đó viết script gọi tính năng AI của bạn hàng nghìn lần.
- Đặt giới hạn chi tiêu hoặc cảnh báo tại mọi nhà cung cấp trả phí.
- Yêu cầu đăng nhập cho mọi tính năng tốn tiền theo mỗi lượt gọi.
- Thêm giới hạn tốc độ theo từng người dùng. Xem giới hạn tốc độ (rate limiting) là gì.
Thêm giới hạn 30 yêu cầu AI cho mỗi người dùng mỗi giờ tới /api/chat. Trả về thông báo rõ ràng khi chạm giới hạn. Từ chối yêu cầu từ người dùng chưa đăng nhập.
Bước 6: Thay key bị rò rỉ
Nếu một secret key xuất hiện ở nơi nó không nên — tin nhắn chat, commit, ảnh chụp màn hình, yêu cầu hỗ trợ, mã trình duyệt — hãy coi như nó đã bị xâm phạm.
- Tạo key mới tại nhà cung cấp.
- Cập nhật secret trong cài đặt ứng dụng.
- Triển khai lại hoặc xuất bản lại để ứng dụng đang chạy dùng key mới.
- Xóa key cũ tại nhà cung cấp.
- Kiểm tra nhật ký sử dụng của nhà cung cấp xem có hoạt động nào bạn không nhận ra.
Xóa tin nhắn chat hoặc commit Git là chưa đủ. Lịch sử Git vẫn giữ các phiên bản cũ, và bất cứ thứ gì đã công khai có thể đã được sao chép.
Lỗi thường gặp
- Dán key vào prompt. Lúc này nó đã nằm trong lịch sử chat. Hãy dùng biểu mẫu secrets thay thế.
- Tiền tố công khai trên biến bí mật.
VITE_OPENAI_API_KEYsẽ gửi key tới mọi khách truy cập. - Commit tệp
.env. Hãy đảm bảo nó nằm trong.gitignoretrước lần push đầu tiên. - Một key dùng cho mọi nơi. Dùng key riêng cho thử nghiệm và thật, và cho từng ứng dụng.
- Không có giới hạn chi tiêu. Một key bị lộ hoặc bị lạm dụng mà không có trần có thể làm hóa đơn tăng lớn trước khi bạn nhận ra.
- Giấu thay vì thay. Một khi key đã bị lộ, chỉ có key mới mới khắc phục được.
- Key trong ảnh chụp màn hình. Cắt hoặc làm mờ trang cài đặt trước khi chia sẻ để nhờ hỗ trợ.
Danh sách kiểm tra
- Mọi key được lưu dưới dạng secret hoặc biến môi trường, không nằm trong mã.
- Không có tệp
.envhoặc key nào được commit lên Git. - Secret key chỉ được dùng trong mã phía máy chủ.
- Không có biến bí mật nào dùng tiền tố công khai như
VITE_hoặcNEXT_PUBLIC_. - Tôi đã tìm trong JavaScript của website đang chạy theo tiền tố của từng key và không thấy gì.
- Key có phạm vi hoặc bị hạn chế khi nhà cung cấp cho phép.
- Key thử nghiệm và key thật được tách riêng.
- Tính năng tốn phí yêu cầu đăng nhập và có giới hạn theo từng người dùng.
- Mỗi nhà cung cấp trả phí đều có trần chi tiêu hoặc cảnh báo.
- Tôi biết cách thay từng key, và mọi key từng bị lộ đã được thay.
Giữ key an toàn trên Mythex
Mythex giữ key ra khỏi mã và chat theo hai cách:
- Thẻ yêu cầu secrets. Khi agent cần một key, nó hiển thị một thẻ trong chat nơi bạn nhập giá trị vào các trường biểu mẫu, không phải ô tin nhắn, và giá trị được lưu như một secret của dự án. Xem Secrets trong chat.
- Project settings → Secrets, hoặc
/secretstrong chat, để tự thêm hoặc đổi key. Xem Biến môi trường và secrets.
Sau khi đổi secret của một ứng dụng đã xuất bản, hãy xuất bản lại để ứng dụng đang chạy nhận giá trị mới. Các dự án đã xuất (export) không bao gồm secrets, nên hãy thêm lại chúng ở bất cứ nơi nào bạn chạy mã tiếp theo. Nếu một key từng xuất hiện trong chat, hãy thay nó tại nhà cung cấp.
Để hoàn thành phần còn lại của bước kiểm tra bảo mật trước khi ra mắt, hãy làm theo danh sách kiểm tra bảo mật cho ứng dụng do AI xây dựng. Nếu bạn đang thêm tính năng AI, cách sử dụng LLM API đề cập sâu hơn về key và chi phí.
Câu hỏi thường gặp
Có an toàn không khi đặt API key trong mã frontend?
Chỉ an toàn khi nhà cung cấp thiết kế key đó để công khai, như publishable key của Stripe hoặc key bản đồ được giới hạn theo tên miền của bạn. Bất kỳ key nào có thể tiêu tiền hoặc đọc dữ liệu riêng tư đều phải ở lại trên máy chủ, vì bất cứ thứ gì gửi tới trình duyệt đều có thể bị bất kỳ ai đọc.
Tôi nên làm gì nếu đã dán API key vào chat hoặc một repo công khai?
Hãy thay key: tạo key mới tại nhà cung cấp, cập nhật secret của ứng dụng, xuất bản lại, rồi xóa key cũ. Xóa tin nhắn hoặc commit là chưa đủ, vì các bản sao có thể đã tồn tại.
API key nên được lưu ở đâu?
Trong biến môi trường hoặc phần cài đặt secret của máy chủ lưu trữ, được mã phía máy chủ đọc khi chạy. Không nên ghi chúng vào tệp mã nguồn, commit lên Git, hay đưa vào ảnh chụp màn hình.
Làm sao biết API key của tôi bị lộ trên website?
Mở website đang chạy, xem mã nguồn trang và các tệp JavaScript trong công cụ dành cho nhà phát triển của trình duyệt, rồi tìm phần đầu của key. Nếu xuất hiện, key đã bị lộ và cần chuyển lên máy chủ và thay mới.