From 5b09a31ed7cf730ed05fad7c9540d07ee874cd70 Mon Sep 17 00:00:00 2001 From: "yupi-translate-app[bot]" <256304331+yupi-translate-app[bot]@users.noreply.github.com> Date: Thu, 5 Feb 2026 13:53:24 +0000 Subject: [PATCH] =?UTF-8?q?[GitHub=20Global]=20Translate=20Vibe=20Coding?= =?UTF-8?q?=20=E9=9B=B6=E5=9F=BA=E7=A1=80=E6=95=99=E7=A8=8B/30=20=E7=BB=8F?= =?UTF-8?q?=E9=AA=8C=E6=8A=80=E5=B7=A7/09=20Vibe=20Coding=20=E5=AE=89?= =?UTF-8?q?=E5=85=A8=E9=98=B2=E6=8A=A4=E6=8A=80=E5=B7=A7.md=20to=20zh-TW?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../30 经验技巧/09 Vibe Coding 安全防护技巧.md | 491 ++++++++++++++++++ 1 file changed, 491 insertions(+) create mode 100644 translations/zh-TW/Vibe Coding 零基础教程/30 经验技巧/09 Vibe Coding 安全防护技巧.md diff --git a/translations/zh-TW/Vibe Coding 零基础教程/30 经验技巧/09 Vibe Coding 安全防护技巧.md b/translations/zh-TW/Vibe Coding 零基础教程/30 经验技巧/09 Vibe Coding 安全防护技巧.md new file mode 100644 index 0000000..818cfaf --- /dev/null +++ b/translations/zh-TW/Vibe Coding 零基础教程/30 经验技巧/09 Vibe Coding 安全防护技巧.md @@ -0,0 +1,491 @@ +# Vibe Coding 安全防護技巧 + +> 保護你的專案和 API 密鑰 + + + +你好,我是魚皮。 + +很多沒有程式基礎的同學在用 AI 做專案時,完全不考慮安全問題。反正程式能跑就行,至於安全不安全,等出了問題再說。但實際上,一個安全問題可能會毀掉整個專案。 + +我見過有人因為 API Key 洩露,一夜之間被刷了幾千。也見過有人的資料庫被刪,所有用戶資料都沒了。至於那些大公司的專案,但凡出點兒問題,都會引起軒然大波。 + +這篇文章,我就來講講 Vibe Coding 中最容易忽視的安全問題,以及如何避免它們。 + + + + +## 一、致命問題 - API Key 洩露 + +在所有安全問題中,API Key 洩露是最常見、也是最致命的之一。 + + + +### 什麼是 API Key? + +API Key 就像你家的鑰匙,有了它,就能使用某個服務。比如 OpenAI 的 API Key 能讓你調用 ChatGPT,Supabase 的 API Key 能讓你訪問資料庫。 + +問題是,如果這個鑰匙被別人拿到了,他們就能冒充你使用這些服務。如果是付費服務,他們會花你的錢;如果是資料庫,他們可能會讀取、修改甚至刪除你的資料。 + + + + +### 洩露的常見方式 + +API Key 最常見的洩露方式是:**直接寫在程式裡,然後上傳到 GitHub**。 + +很多同學可能會這樣寫調用 AI 大模型的程式: + +```typescript +// ❌ 千萬不要這樣做! +const OPENAI_API_KEY = 'sb-yupi-abc123def456...'; + +const response = await fetch('https://xxx/v1/chat/completions', { + headers: { + 'Authorization': `Bearer ${OPENAI_API_KEY}` + } +}); +``` + +然後把程式推送到 GitHub。 + +結果呢? + +由於你的 GitHub 專案選擇了公開,任何人都能看到你的程式,也就能看到你的 API Key。更糟糕的是,有很多自動化腳本專門在 GitHub 上掃描 API Key,一旦發現就會立刻使用。 + +我聽說過有位老哥把 OpenAI 的 API Key 直接寫在了前端程式裡,然後別人直接從瀏覽器的開發者工具裡找到了他的 API Key,幾個小時內就被刷了上千。等他發現時,錢已經花光了。 + +這個教訓告訴我們:**API Key 洩露不是小事,一定要重視。** + + + + +## 二、如何正確管理敏感資訊? + +既然不能把 API Key 寫在程式裡,那應該怎麼做呢? + + + +### 使用環境變數 + +正確的做法是使用環境變數。 + +環境變數是存儲在系統或運行環境中的配置資訊,不會被包含在程式裡。 + +#### 第一步、建立 .env 檔案 + +在專案根目錄建立一個 `.env` 檔案: + +``` +OPENAI_API_KEY=sb-yupi-abc123def456... +SUPABASE_URL=https://xxx.supabase.co +SUPABASE_ANON_KEY=eyJhbGci... +DATABASE_URL=postgresql://... +``` + + + +#### 第二步、在程式中使用 + +在程式裡透過 `process.env` 訪問這些變數: + +```typescript +// ✅ 正確的做法 +const OPENAI_API_KEY = process.env.OPENAI_API_KEY; + +const response = await fetch('https://xxx/v1/chat/completions', { + headers: { + 'Authorization': `Bearer ${OPENAI_API_KEY}` + } +}); +``` + + + +#### 第三步、添加到 .gitignore + +確保 `.env` 檔案不會被上傳到 GitHub: + +``` +# .gitignore +.env +.env.local +.env.*.local +``` + + + +#### 第四步、建立 .env.example + +為了讓其他人知道需要哪些環境變數,建立一個 `.env.example` 檔案: + +``` +OPENAI_API_KEY=your_openai_api_key_here +SUPABASE_URL=your_supabase_url_here +SUPABASE_ANON_KEY=your_supabase_key_here +DATABASE_URL=your_database_url_here +``` + +這個檔案可以上傳到 GitHub,因為它不包含真實的密鑰。 + + + +### 前端和後端的區別 + +這裡有一個重要的區別:**前端程式是公開的,後端程式是私密的。** + +在前端(瀏覽器中運行的程式)中,即使你用了環境變數,最終這些值還是會被打包到 JavaScript 檔案裡,用戶可以透過開發者工具看到。所以,**絕對不要在前端程式中使用敏感的 API Key**! + +正確的做法是: + +- 敏感的 API 調用放在後端 +- 前端只調用你自己的後端 API +- 後端驗證用戶身份後,再調用第三方 API + +透過程式舉一些例子: + +```typescript +// ❌ 不要在前端直接調用 OpenAI +// 前端程式 +const response = await fetch('https://api.openai.com/v1/chat/completions', { + headers: { 'Authorization': `Bearer ${OPENAI_API_KEY}` } +}); + +// ✅ 應該這樣做 +// 前端程式:調用自己的後端 +const response = await fetch('/api/chat', { + method: 'POST', + body: JSON.stringify({ message: userMessage }) +}); + +// 後端程式:調用 OpenAI +export async function POST(request: Request) { + const { message } = await request.json(); + + // 在後端使用 API Key + const response = await fetch('https://api.openai.com/v1/chat/completions', { + headers: { 'Authorization': `Bearer ${process.env.OPENAI_API_KEY}` }, + body: JSON.stringify({ messages: [{ role: 'user', content: message }] }) + }); + + return response; +} +``` + + + +### 使用密鑰管理服務 + +如果是生產環境,建議使用專門的密鑰管理服務,比如 Vercel 的環境變數管理、AWS Secrets Manager、HashiCorp Vault 等。這些服務提供了更安全的密鑰存儲和訪問控制,大公司一般會這麼做。 + + + +## 三、其他常見安全問題 + +除了 API Key 洩露,還有一些常見的安全問題。 + + + +### SQL 注入 + +SQL 注入是最經典的安全漏洞之一。如果你直接把用戶輸入拼接到 SQL 查詢裡,攻擊者可以透過特殊的輸入來執行惡意的 SQL 語句。 + +```typescript +// ❌ 危險:SQL 注入風險 +const query = `SELECT * FROM users WHERE email = '${userEmail}'`; + +// ✅ 安全:使用參數化查詢 +const query = 'SELECT * FROM users WHERE email = ?'; +const result = await db.execute(query, [userEmail]); +``` + +好在,如果你用的是 Supabase、Prisma 等現代工具,它們會自動幫你防止 SQL 注入。但如果你寫原始 SQL,一定要注意這個問題。 + + + +### XSS 攻擊 + +XSS(跨站腳本攻擊)是指攻擊者在你的網站上注入惡意腳本。 + +比如,如果你直接把用戶輸入的內容顯示在頁面上: + +```typescript +// ❌ 危險:XSS 風險 +function Comment({ text }) { + return
; +} +``` + +攻擊者可以輸入 ``,這段腳本就會在其他用戶的瀏覽器中執行。 + + + +正確的做法是: + +```typescript +// ✅ 安全:React 會自動轉義 +function Comment({ text }) { + return