快速摘要
AI 寫的程式碼「能跑」不代表「安全」。根據研究,AI 生成的程式碼中有 30-40% 包含至少一個安全漏洞。這篇提供一份實用的檢查清單,讓你在 merge 之前抓出最常見的問題。
為什麼需要審查 AI 程式碼
AI 生成的程式碼有幾個系統性的安全問題:
- 訓練資料中的壞習慣:AI 從 GitHub 上數百萬個 repo 學習,其中很多程式碼本身就不安全
- 偏好「能跑」而非「安全」:AI 優先產生功能正確的程式碼,安全性不是預設目標
- 缺乏上下文:AI 不知道你的應用場景、威脅模型和合規要求
- 過時的做法:AI 可能使用已知有問題的函式庫版本或已棄用的 API
最常見的漏洞類型
| 漏洞 | 常見程度 | 影響 | 範例 |
|---|---|---|---|
| 硬編碼密碼/Key | 非常常見 | 嚴重 | API Key 直接寫在程式碼中 |
| SQL Injection | 常見 | 嚴重 | 字串拼接而非參數化查詢 |
| XSS | 常見 | 中高 | innerHTML 直接插入使用者輸入 |
| 缺少輸入驗證 | 非常常見 | 中 | 沒有檢查輸入長度和格式 |
| 不安全的依賴 | 常見 | 中高 | 使用有已知漏洞的套件版本 |
| CORS 設定過寬 | 常見 | 中 | Access-Control-Allow-Origin: * |
| 缺少錯誤處理 | 常見 | 低中 | 錯誤訊息洩漏內部資訊 |
安全檢查清單
1. 認證與授權
- 有沒有硬編碼的密碼、API Key 或 Token?
- 認證邏輯是否正確(不是只檢查前端)?
- API endpoint 有沒有授權檢查?
2. 輸入處理
- 所有使用者輸入是否經過驗證?
- SQL 查詢是否使用參數化查詢?
- HTML 輸出是否經過 escape?
- 檔案上傳是否限制類型和大小?
3. 資料保護
- 敏感資料是否加密儲存?
- 密碼是否用 bcrypt/argon2 雜湊?
- 日誌中是否記錄了敏感資訊?
4. 依賴安全
- 套件版本是否有已知漏洞?(npm audit / pip audit)
- 是否使用了已棄用的 API?
- lock 檔案是否 commit 到 Git?
5. 設定安全
- 有沒有 debug mode 被開啟?
- CORS 設定是否過於寬鬆?
- 有沒有設定安全 headers?
自動化工具
| 工具 | 類型 | 費用 | 語言支援 |
|---|---|---|---|
| Semgrep | 靜態分析 | 免費 / 付費 | 多語言 |
| Snyk | 依賴掃描 | 免費 / 付費 | 多語言 |
| CodeQL | 靜態分析 | GitHub 免費 | 多語言 |
| npm audit | 依賴掃描 | 免費 | Node.js |
| Bandit | 靜態分析 | 免費 | Python |
審查工作流程
- 自動化掃描:在 CI/CD 中加入 Semgrep 和 npm audit
- diff 檢查:逐行檢查 AI 生成的程式碼變動
- 重點審查:對照上面的清單逐項檢查
- 測試覆蓋:確保安全相關的邏輯有測試覆蓋
- 簽核:至少一個人審查通過才能 merge
常見問題
AI 生成的程式碼真的不安全嗎?
不是說 AI 生成的程式碼一定不安全,而是它不會「主動」考慮安全。AI 優先考慮的是功能正確性,安全性通常不在預設考量中。所以需要人工審查。
有自動化工具可以檢查嗎?
有。Semgrep、Snyk、CodeQL 都可以自動掃描常見漏洞。但自動化工具不能取代人工審查——它們能抓住已知模式,但抓不住邏輯漏洞。
非工程師也能做程式碼審查嗎?
安全審查確實需要技術背景。如果你不是工程師,至少要做到:1) 檢查有沒有硬編碼的密碼或 Key 2) 確認有沒有外部 CDN 引用 3) 用自動化工具掃描一遍。