快速摘要
研究顯示 AI 生成的程式碼中,安全漏洞的比例高於人類撰寫的程式碼。本文對照 OWASP Top 10,逐一分析 AI 最容易產生的漏洞類型,並提供具體的檢查方法。

AI 程式碼的安全現況

AI 寫的程式碼「看起來」很正確——語法正確、邏輯通順、可以運行。但安全性是另一回事。AI 模型是從大量開源程式碼中學習的,而開源程式碼中本身就包含大量安全漏洞。

常見的問題模式:

  • 缺少輸入驗證和消毒(sanitization)
  • 使用已知有漏洞的函式或套件版本
  • 硬編碼密鑰和憑證
  • 缺少錯誤處理,導致資訊洩漏
  • 不安全的預設設定

OWASP Top 10 對照

OWASP 排名漏洞類型AI 產生頻率範例
A01Broken Access ControlAI 常忘記加入權限檢查
A02Cryptographic Failures使用 MD5 而非 bcrypt
A03InjectionSQL 字串拼接、未消毒的用戶輸入
A04Insecure Design缺少速率限制、CSRF 保護
A05Security MisconfigurationDebug 模式開啟、CORS *
A06Vulnerable Components引用舊版套件
A07Auth FailuresSession 管理不當
A08Data Integrity Failures未驗證外部資料
A09Logging FailuresAI 很少自動加入日誌
A10SSRF未驗證 URL 參數

AI 常犯的漏洞模式

1. SQL Injection

AI 經常生成字串拼接的 SQL 查詢,而非使用參數化查詢。這是最基本也最危險的漏洞。

2. 缺少輸入驗證

AI 生成的 API 端點通常直接使用用戶輸入,沒有驗證型別、長度或格式。

3. 硬編碼秘密

AI 在範例中經常使用硬編碼的 API Key 或密碼,開發者如果直接複製可能忘記替換。

4. 不安全的預設

CORS 設為 *、debug 模式預設開啟、不安全的 cookie 設定——AI 傾向於生成「能跑就好」的設定。

自動化檢查工具

  • Semgrep:輕量級 SAST 工具,有預設的安全規則
  • CodeQL:GitHub 內建的程式碼分析引擎
  • Snyk Code:即時掃描程式碼漏洞
  • Bandit:Python 專用的安全掃描
  • ESLint Security Plugin:JavaScript 安全規則

安全審查工作流

  1. AI 生成程式碼
  2. 開發者初步審查邏輯正確性
  3. 執行自動化 SAST 掃描
  4. 人工檢查 SAST 報告的每一個警告
  5. 特別檢查:輸入驗證、認證授權、秘密管理
  6. 通過所有檢查後才合併

常見問題

AI 生成的程式碼比人寫的更不安全嗎?

研究顯示確實如此。AI 傾向生成功能正確但安全性不足的程式碼,因為它學習的開源程式碼中本身就有大量安全漏洞。關鍵不是不用 AI,而是確保有安全審查流程。

自動化掃描工具能抓到所有漏洞嗎?

不能。SAST 工具可以抓到已知模式的漏洞(如 SQL Injection),但邏輯漏洞、業務邏輯錯誤和設計缺陷需要人工審查。建議兩者結合使用。

如何訓練 AI 生成更安全的程式碼?

在 Prompt 中明確要求:使用參數化查詢、加入輸入驗證、不要硬編碼秘密、使用安全的套件版本。或者建立一個安全 Prompt 模板。