claude-code/claude-zh/skills/security-review/SKILL.md

158 lines
5.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
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 與連線權限已正確設定。
---
**請記住**:安全性並非可選項。任何一個細微的漏洞都可能危害整個平台。如有疑慮,請採取最嚴格的安全策略。