---
name: security-review
description: 在添加身份驗證、處理使用者輸入、管理秘密資訊 (Secrets)、建立 API 端點或實作支付/敏感功能時使用。提供全面的安全性檢查清單與模式。
---

# 安全性審查技能 (Security Review Skill)

本技能確保所有程式碼均遵循安全性最佳實踐，並識別潛在的漏洞與風險。

## 何時啟用

- 實作身份驗證 (Authentication) 或授權 (Authorization)。
- 處理使用者輸入內容或檔案上傳。
- 建立新的 API 端點。
- 處理秘密資訊 (Secrets) 或憑證 (Credentials)。
- 實作支付相關功能。
- 儲存或傳輸敏感數據。
- 整合第三方 API。

## 安全性檢查清單

### 1. 秘密資訊管理 (Secrets Management)

#### ❌ 嚴禁行為
```typescript
const apiKey = "sk-proj-xxxxx"  // 硬編碼的秘密資訊
const dbPassword = "password123" // 直接寫在原始碼中
```

#### ✅ 正確做法
```typescript
const apiKey = process.env.OPENAI_API_KEY
const dbUrl = process.env.DATABASE_URL

// 驗證秘密資訊是否存在
if (!apiKey) {
  throw new Error('未配置 OPENAI_API_KEY')
}
```

#### 驗證步驟
- [ ] 無任何硬編碼的 API 金鑰、權杖 (Tokens) 或密碼。
- [ ] 所有秘密資訊均儲存在環境變數中。
- [ ] `.env.local` 已加入 `.gitignore`。
- [ ] Git 提交歷史中無揭露秘密資訊。
- [ ] 生產環境的秘密資訊已在託管平台（如 Vercel, Railway）中配置。

### 2. 輸入驗證 (Input Validation)

#### 務必驗證所有使用者輸入
```typescript
import { z } from 'zod'

// 定義驗證架構 (Schema)
const CreateUserSchema = z.object({
  email: z.string().email(),
  name: z.string().min(1).max(100),
  age: z.number().int().min(0).max(150)
})

// 處理前先進行驗證
export async function createUser(input: unknown) {
  try {
    const validated = CreateUserSchema.parse(input)
    return await db.users.create(validated)
  } catch (error) {
    if (error instanceof z.ZodError) {
      return { success: false, errors: error.errors }
    }
    throw error
  }
}
```

#### 檔案上傳驗證
- 檢查大小（例如上限 5MB）。
- 檢查 MIME 類型（白名單機制）。
- 檢查副檔名（白名單機制）。

#### 驗證步驟
- [ ] 所有使用者輸入均透過 Schema 驗證。
- [ ] 限制檔案上傳（大小、類型、副檔名）。
- [ ] 查詢語句中不直接使用未經處理的使用者輸入。
- [ ] 使用白名單驗證（非黑名單）。
- [ ] 錯誤訊息不會洩漏敏感資訊。

### 3. 防止 SQL 注入 (SQL Injection Prevention)

#### ❌ 嚴禁拼接 SQL 字串
```typescript
// 危險 — 存在 SQL 注入漏洞
const query = `SELECT * FROM users WHERE email = '${userEmail}'`
```

#### ✅ 務必使用參數化查詢 (Parameterized Queries)
```typescript
// 安全 — 參數化查詢
const { data } = await supabase
  .from('users')
  .select('*')
  .eq('email', userEmail)
```

### 4. 身份驗證與授權

#### 權杖 (Token) 處理
- ❌ **錯誤**：儲存在 `localStorage`（易受 XSS 攻擊）。
- ✅ **正確**：使用 `httpOnly` Cookies。

#### 授權檢查
- 進行敏感操作前，務必重新驗證權限。
- 實作角色權限控制 (RBAC)。
- 在使用 Supabase 時，啟動資料列層級安全性 (RLS)。

### 5. 防止 XSS 攻擊

- **處理 HTML**：務必使用 `DOMPurify` 等工具進行清理。
- **內容安全政策 (CSP)**：配置適當的 CSP 標頭以限制來源。

### 6. 防止 CSRF 攻擊

- 在會變更狀態的操作中使用 CSRF Tokens。
- 將 Cookies 設定為 `SameSite=Strict` 或 `Lax`。

### 7. 速率限制 (Rate Limiting)

- 對所有 API 端點實例化速率限制。
- 對於高成本操作（如搜尋、AI 生成）設定更嚴格的限制。
- 實作基於 IP 或是基於使用者 ID 的限制。

### 8. 避免敏感資料外洩

- **紀錄 (Logging)**：嚴禁在紀錄中包含密碼、完整卡號或 Secrets。
- **錯誤訊息**：對使用者回傳通用報錯，僅在伺服器端紀錄詳細錯誤與堆疊 (Stack Trace)。

### 9. 依賴項安全性

- 定期執行 `npm audit`。
- 務必將 `package-lock.json` 或 `yarn.lock` 納入版本控制。
- 啟動 GitHub Dependabot 以獲取安全性更新提醒。

## 生產環境部署前安全性檢查清單 (Pre-Deployment)

- [ ] **秘密資訊**：確保無硬編碼內容，全數依賴環境變數。
- [ ] **輸入驗證**：所有入口點均已實作驗證。
- [ ] **SQL 注入**：所有資料庫操作均採參數化形式。
- [ ] **XSS/CSRF**：對內容進行清理並啟用防禦機制。
- [ ] **身份/授權**：權杖處理安全且角色檢查邏輯正確。
- [ ] **速率限制**：公共 API 端點已受保護。
- [ ] **HTTPS**：生產環境強制執行。
- [ ] **安全性標頭**：已配置 CSP, X-Frame-Options 等。
- [ ] **依賴項**：已掃描漏洞並更新至安全版本。
- [ ] **資料庫安全性**：RLS 與連線權限已正確設定。

---

**請記住**：安全性並非可選項。任何一個細微的漏洞都可能危害整個平台。如有疑慮，請採取最嚴格的安全策略。
