| name | secret-scanner |
| description | 自動掃描程式碼中的敏感資訊。當準備 commit、編輯設定檔、新增環境變數、或建立 PR 時自動執行。檢測 API keys、tokens、密碼、資料庫連線字串等敏感資訊,防止意外洩漏。 |
| allowed-tools | ["Read","Glob","Grep","Bash(git diff *)","Bash(git status *)"] |
Secret Scanner - 敏感資訊掃描
自動觸發時機
Claude 會在以下情況自動執行此 skill:
| 觸發情境 | 說明 |
|---|
| 準備 Commit | 在 commit 前檢查 staged 檔案 |
| 編輯設定檔 | 修改 .env、config 等檔案 |
| 新增環境變數 | 任何涉及環境變數的變更 |
| 建立 PR | PR 建立前的最終檢查 |
| 新增檔案 | 建立新檔案時檢查內容 |
掃描模式
1. API Keys & Tokens
# AWS
AKIA[0-9A-Z]{16}
aws[_-]?(secret[_-]?access[_-]?key|access[_-]?key[_-]?id)
# Anthropic
sk-ant-[a-zA-Z0-9-_]{40,}
# OpenAI
sk-[a-zA-Z0-9]{48}
# Gemini/Google
AIza[0-9A-Za-z-_]{35}
# Groq
gsk_[a-zA-Z0-9]{52}
# Slack
xox[baprs]-[0-9]{10,13}-[a-zA-Z0-9-]+
# GitHub
gh[pousr]_[A-Za-z0-9_]{36,}
github_pat_[a-zA-Z0-9]{22}_[a-zA-Z0-9]{59}
# Generic
api[_-]?key\s*[:=]\s*['"][^'"]{20,}['"]
secret[_-]?key\s*[:=]\s*['"][^'"]{20,}['"]
2. 資料庫連線
# PostgreSQL
postgres(ql)?://[^:]+:[^@]+@[^/]+/\w+
# MySQL
mysql://[^:]+:[^@]+@[^/]+/\w+
# MongoDB
mongodb(\+srv)?://[^:]+:[^@]+@[^/]+
# Redis
redis://[^:]+:[^@]+@[^:]+:\d+
3. 私鑰與憑證
# Private Keys
-----BEGIN (RSA |EC |OPENSSH |DSA )?PRIVATE KEY-----
-----BEGIN PGP PRIVATE KEY BLOCK-----
# Certificates
-----BEGIN CERTIFICATE-----
4. 密碼模式
password\s*[:=]\s*['"][^'"]+['"]
passwd\s*[:=]\s*['"][^'"]+['"]
pwd\s*[:=]\s*['"][^'"]+['"]
執行流程
步驟 1: 識別掃描範圍
git diff --cached --name-only
find . -type f \( -name "*.ts" -o -name "*.js" -o -name "*.env*" -o -name "*.json" \)
步驟 2: 排除安全檔案
白名單(不掃描):
.env.example - 範例檔案(無真實值)
*.test.ts - 測試檔案中的 mock 值
node_modules/ - 第三方套件
.git/ - Git 內部檔案
步驟 3: 執行掃描
對每個檔案:
- 讀取內容
- 執行所有敏感模式匹配
- 記錄發現的問題
步驟 4: 驗證發現
區分真正的敏感資訊和誤報:
| 類型 | 處理方式 |
|---|
| 真實 API Key | 🔴 立即警告,阻止提交 |
| 環境變數引用 | ✅ 安全(如 process.env.API_KEY) |
| 範例/Mock 值 | ✅ 安全(如 sk-test-xxx) |
| 文件說明 | ✅ 安全(文檔中的格式說明) |
輸出格式
發現敏感資訊
## 🚨 Secret Scanner 警告
### 發現敏感資訊!
| 檔案 | 行號 | 類型 | 風險等級 |
|------|------|------|---------|
| `apps/server/config.ts` | 15 | API Key | 🔴 高 |
| `packages/env/index.ts` | 42 | DB Password | 🔴 高 |
### 詳細資訊
#### 🔴 apps/server/config.ts:15
**類型**: Gemini API Key
**發現內容**: `AIzaSyB...`(已遮蔽)
**建議**: 移至環境變數
\`\`\`typescript
// ❌ 不安全
const apiKey = "AIzaSyB...";
// ✅ 安全
const apiKey = process.env.GEMINI_API_KEY;
\`\`\`
### ⛔ 行動要求
1. **不要提交這些變更**
2. 將敏感資訊移至 `.env` 檔案
3. 確保 `.env` 在 `.gitignore` 中
4. 重新掃描確認安全
掃描通過
## ✅ Secret Scanner 通過
**掃描範圍**: X 個檔案
**掃描時間**: YYYY-MM-DD HH:mm
### 檢查項目
- [x] API Keys & Tokens
- [x] 資料庫連線字串
- [x] 私鑰與憑證
- [x] 硬編碼密碼
### 白名單排除
- `.env.example` (範例檔案)
- `tests/**` (測試 mock)
**結論**: 未發現敏感資訊,可以安全提交。
專案特定規則
此專案的敏感資訊位置
| 環境變數 | 用途 | 應在檔案 |
|---|
GEMINI_API_KEY | Gemini AI | .env |
GROQ_API_KEY | Groq Whisper | .env |
SLACK_BOT_TOKEN | Slack Bot | Cloudflare Secrets |
DATABASE_URL | PostgreSQL | .env / Cloudflare |
BETTER_AUTH_SECRET | Auth 加密 | .env |
安全的引用方式
import { env } from "@sales-ai/env";
const apiKey = env.GEMINI_API_KEY;
const apiKey = "AIzaSyB...";
整合的工具
| 工具 | 用途 |
|---|
Grep | 執行正則匹配 |
Read | 讀取檔案內容 |
Glob | 找出需掃描的檔案 |
Bash(git) | 識別變更範圍 |
相關 Skills
/commit - Commit 前自動執行掃描
/pr-review - PR 前執行掃描
/security-audit - 完整安全審計