生活分享

AI 寫的程式能信嗎:審查、測試與安全檢查清單

代理寫完程式、按下合併之前先做完這張清單:讀 diff 確認改動沒有超出你交代的、跑測試並檢查斷言是不是真的在驗行為、確認相依套件存在且授權可用並鎖定版本、把金鑰與 .env 擋在 repo 外、檢查輸入驗證與注入、把代理的權限縮到最小,最後用 PR 範本、CI 與 Dependabot 固定成流程。依 OWASP、GitHub 官方文件與三家代理的官方安全說明整理,並說明什麼時候該找人審。

閱讀時間約 8 分鐘

插圖:一份有增刪標記的程式改動文件,經過一道由盾牌與勾選標記組成的檢查關卡,再沿著箭頭匯流成一條合併線。
圖片:Mokaair (© Mokaair)

寫程式的速度不是問題,問題是要不要把產出的改動直接合併。可以用,但不能跳過審查,而且要看的地方跟你自己寫程式時不一樣:代理常犯的錯有固定幾種,改動超出交代、測試寫來配合實作、引用不存在的套件、把金鑰寫進程式碼。

這篇把合併前該做的事排成一張初學者也做得到的清單,每一項說明怎麼檢查、用什麼工具接住,最後變成 PR 範本與 CI 設定。內容依 OWASP、GitHub 與三家代理的官方文件整理,查證日是 2026 年 9 月 14 日。

先讀 diff,再談其他

第一步不是跑測試,是打開改動本身。代理很常順手多做一點:重構你沒提到的檔案、改設定檔、刪掉看起來沒用的程式;單看每行合理,合起來卻改變行為。

先看改了哪些檔案,再逐行看內容 · bash
git status
git diff --stat
git diff
git log --oneline main..HEAD

讀的時候問三個問題:檔案在範圍裡嗎?有沒有刪掉我沒要求刪的?有沒有一段我看不懂?第三個最重要,看不懂就不要合併。OWASP 的 Top 10 把過度代理(Excessive Agency)列為 LLM06:2025,成因之一是系統拿到超出需要的功能與權限。

你也可以請代理先審自己一次:不是把判斷交給它,而是逼它把做了什麼列成清單,你再拿這份自述對照 diff。

請代理自我審查的提示詞 · text
請先不要修改任何檔案,只做一次自我審查,並用這五點回答我:
1. 這次改動包含哪些檔案?其中哪些不在我一開始交代的範圍內?
2. 有沒有刪除或改寫我沒有要求更動的程式?逐項列出並說明理由。
3. 新增了哪些相依套件?每一個附上官方套件頁面網址、授權條款,以及為什麼非加不可。
4. 有沒有把金鑰、密碼、連線字串或測試帳號寫進程式碼或設定檔?
5. 使用者輸入在哪些地方進入資料庫查詢或系統命令?用的是參數化查詢嗎?
最後列出三個你自己最不確定、建議我人工確認的地方。

如果它一次改十幾個檔案而你讀不動,那是任務給得太大,把需求拆小、先提計畫。

測試要看斷言,不是看有沒有綠燈

第二步是跑測試,並讓代理補測試。陷阱在於:測試也可能是 為了讓實作通過而寫的。它可能把斷言寫成「有回傳就好」,或把現在的輸出照抄進期望值,於是測試會過,卻是永遠亮綠燈的儀表板。

  • 斷言驗的是回傳值等於具體結果,還是只驗沒拋出例外?
  • 期望值是從需求推出來的,還是照抄現在的輸出?
  • 錯誤輸入、空值、權限不足有沒有測到?
  • 故意把實作改錯一行,測試會不會紅?

最後一項值得養成習慣:不必懂整個測試框架,只要把回傳值改錯、看測試會不會變紅。

相依套件:名字、授權與鎖定版本

AI 產出的程式常帶進新套件,這是最該停下來確認的一步。OWASP 的 LLM09:2025 Misinformation 直接點名:模型會建議不安全或不存在的程式庫,而攻擊者會找出常被幻覺出來的名字,搶先發佈同名的惡意套件。

這不是假想。發表在 USENIX Security 2025 的研究分析 16 個程式碼生成模型、576,000 筆樣本,商用模型的套件幻覺率至少 5.2%,開源模型 21.7%,共蒐集到 205,474 個不存在的套件名。

  • 確認存在:到 npm 或 PyPI 官方頁面看發佈紀錄、維護者與更新時間,剛建立、下載量極低的別裝。
  • 看授權:OWASP 的 LLM03:2025 Supply Chain 提醒,開源與專有授權的法律要求不同,沒管理就是風險。
  • 鎖定版本:照鎖定檔安裝,否則審過的和實際跑的不是同一份。
照鎖定檔安裝,不讓安裝過程自己升版 · bash
npm ci
pip install --require-hashes -r requirements.txt

npm 官方文件說明 npm ci 必須有 package-lock.json、絕不寫回鎖定檔,和 package.json 對不上時直接報錯。pip 的安全安裝文件說明,雜湊檢查模式用 requirements.txt 裡的雜湊值防止遠端竄改,並要求所有相依用 == 鎖版。

金鑰、注入,與會讀網頁的代理

金鑰、資料庫密碼與 .env 檔不要進 repo,沒有例外。代理為了讓程式跑起來,很容易把金鑰寫進程式碼。把 .env 加進 .gitignore,程式改從環境變數讀值。

更可靠的是讓平台幫你擋。GitHub 的 secret scanning 會掃描所有分支的整個 Git 歷史,找出寫死的 API 金鑰、密碼與 token;push protection 在推送當下就擋,範圍包括命令列推送、網頁介面的 commit、檔案上傳與 REST API。公開 repo 免費就能用。

接著看輸入驗證。OWASP Top 10 的 2025 年版把注入列為 A05:2025,涵蓋 SQL、作業系統命令、ORM、LDAP 等,首選做法是使用不經過直譯器、或提供化介面的安全 API;SQL 注入防護速查表更直接:教人寫查詢就該教他用綁定變數的預備語句。看 AI 寫的查詢,重點是輸入有沒有被串進字串。

如果代理會讀網頁、讀 issue、讀別人傳來的檔案,還要多防一種注入。OWASP 的 LLM Top 10 把提示詞注入排在第一位 LLM01:2025。Anthropic 的 Claude Code 安全文件把它定義為攻擊者插入惡意文字、覆蓋或操縱 AI 助理的指令,說明 curl、wget 這類命令預設不自動核准,並建議:核准前先看命令、不把不可信內容直接餵給模型、用虛擬機器執行腳本。

權限與沙盒:只給它需要的那個目錄

前面是看結果,這一項是事先設好邊界。OWASP 的 LLM06:2025 建議很直白:功能與權限限制在最小必要範圍,並用人工介入機制,讓高影響的動作先有人核准。

  • Anthropic:Claude Code 手動模式以唯讀權限起步,要編輯檔案或執行命令都先問你,也只能寫入啟動時所在的資料夾與其子資料夾。
  • OpenAI:Codex 預設關閉網路存取,本機用作業系統層級的沙盒把可觸及範圍限制在工作區;官方建議有版本控制的資料夾用 Auto,沒有的用唯讀。
  • Google:Gemini CLI 的受信任資料夾在尚未信任時進入受限安全模式,不載入工作區的 settings.json 與 .env,也不能裝擴充套件。

原則一樣:先在唯讀模式讓它讀懂專案、提計畫,方向對了再放開寫入。

把檢查做成流程,並知道什麼時候該找人審

上面每一項都能靠自律做到,但自律會在趕時間時失效,寫成檔案讓工具替你記住。

  • PR 範本:放一個 .github/pull_request_template.md 寫成勾選清單;GitHub 說明也可放在根目錄或 docs,合併進預設分支後協作者都看得到。
  • CI:GitHub Actions 的工作流程檔放在 .github/workflows,官方把「為每一個 pull request 建置與測試」列為典型用途。
  • 相依更新:開啟 Dependabot alerts 與 security updates,套件有已知漏洞時自動開 PR 升到修補版本。
  • 程式碼掃描:code scanning 用 CodeQL 找漏洞,可排程也可在推送時觸發;公開 repo 可直接用,私有 repo 要 GitHub Code Security 授權。
最小可用的 .github/pull_request_template.md · markdown
## 這個 PR 做了什麼

## 合併前檢查
- [ ] 我讀完整份 diff,沒有超出需求的檔案改動
- [ ] 測試的斷言在驗行為,故意改壞會變紅
- [ ] 新增的相依套件確認存在、授權可用,並照鎖定檔安裝
- [ ] 沒有金鑰、密碼或 .env 進入 repo
- [ ] 使用者輸入走參數化查詢,沒有字串拼接
- [ ] CI 全部通過
.github/dependabot.yml:每週檢查一次 npm 相依 · yaml
version: 2
updates:
  - package-ecosystem: "npm"
    directory: "/"
    schedule:
      interval: "weekly"

最後,有些改動不該由你加上 AI 就決定,下面幾種情況要找人看過再合併。

  • 碰到身分驗證、授權、付款、個資或金鑰管理
  • 涉及資料庫遷移、刪除等回不去的操作
  • 你看不懂那段程式,代理的解釋也無法驗證
  • 要上線給真實使用者,而你是第一次做
  • 代理順手改了 CI 或部署設定

流程圖:代理產出 diff 後依序經過讀改動範圍、跑測試看斷言、查套件與金鑰、看注入與權限、CI 與 PR 範本五道關卡才合併,任一關沒過就退回代理重做或找人審。
從代理交出改動到合併的五道關卡,任一關沒過都回到左邊,不要往右推。 · 圖片:Mokaair (© Mokaair)
閱讀完整文字說明

流程圖。起點是代理產出 diff,接著依序通過五道關卡:關卡一讀改動範圍,確認沒有你沒交代的檔案;關卡二跑測試並看斷言,故意改壞一行看測試會不會變紅;關卡三查套件與金鑰,確認套件存在、授權可用、版本鎖定,且 .env 沒有進入 repo;關卡四看注入與權限,使用者輸入走參數化查詢,代理的可寫目錄與網路存取限制在最小必要;關卡五是 CI 與 PR 範本,lint 與測試通過、勾選清單勾完才合併。任何一關沒過,就把改動退回代理重做,或找懂這塊的人審,回到最左邊重新走一次,不要往右推。

合併前的檢查清單,2026 年 9 月依官方文件整理。
檢查項目怎麼檢查用什麼工具
改動範圍逐行讀完,沒有你沒交代的改動git diff --stat
測試斷言驗行為還是有回傳就好;改壞會不會紅專案的測試指令
套件真偽官方頁面有發佈紀錄與維護者npm、PyPI 官網
版本鎖定照鎖定檔安裝,不讓它自己升版npm ci、pip 的 --require-hashes
已知漏洞有修補版本時自動開 PRDependabot
金鑰外洩.env 進 .gitignore,推送當下攔截secret scanning、push protection
注入風險輸入沒被直接串進 SQL 或命令參數化查詢、code scanning
代理權限可寫目錄與網路是最小必要權限模式與沙盒
  • 生活分享

    Claude Code、Codex 搭本機模型:兩種接法怎麼選

    Claude Code 與 Codex 搭配本機模型有兩種接法:代理照常連雲端、把大量雜務交給腳本或 MCP 工具去問本機模型,或是把代理的模型整個換成本機模型。這篇用資料能不能出門、上下文開得夠不夠長、工作的類型三個問題幫你選,並對照 Ollama、LM Studio、Anthropic 與 OpenAI 的官方文件,分清楚本機權重、Ollama 的 cloud 標籤與供應商端點是三種不同的東西。

  • 生活分享

    把本機模型包成 MCP 工具,Claude Code 與 Codex 共用一支伺服器

    用官方 Python SDK 寫一支 stdio 的 MCP 伺服器,把本機的 Ollama 模型包成工具,Claude Code 與 Codex 就能共用:工具只收 inbox 底下的路徑,只回分類結果與結果檔路徑,不回信件原文。文中列出兩邊的登記指令、逾時與輸出上限的官方預設值,以及換成別家本機模型只改環境變數 LOCAL_MODEL 的做法,步驟都來自官方文件。

  • 生活分享

    把 Claude Code、Codex 整個換成本機模型:Ollama 與 LM Studio 設定與還原

    Ollama、LM Studio 與 Codex 的文件寫了把 Claude Code、Codex 整個換成本機模型的接法:Ollama 用 ollama launch 一行指令或手動設定,LM Studio 先開本機伺服器再設環境變數或加 --oss。這篇把四種組合的指令、兩家文件建議的上下文長度、Claude Code 用 /status 確認連到誰的方法,以及用完怎麼還原整理在一起;需要先裝好 Ollama 或 LM Studio,並且已有 Claude Code 或 Codex。

  • 生活分享

    Claude Code、Codex 搭本機模型的注意事項:開工前的檢查清單

    Claude Code 或 Codex 搭本機模型之前,先照一張表逐項核對:代理讀不讀得到原始檔、現在連的是誰、標籤是不是 :cloud、上下文實際開多長、逾時與輸出量、怎麼驗收。每一項寫怎麼檢查,並指出詳見同組哪一篇,另外收進供應商端點、條款與授權、繁體中文用字檢查;檢查方法取自 Anthropic、OpenAI、Ollama 與 DeepSeek 的官方文件。

最新旅遊情報攻略

資料來源

生活分享