# Git Diff 風險評估自動化:PowerShell 串接 AI 產出程式異動風險及報告 > **前言**: > 之前我分享過如何用 PowerShell 自動開啟 Meld 進行視覺化比對。 > 但隨著專案越來越大,我發現光靠「眼睛」看 Code 是不夠的。 > > 眼睛能看到程式碼變了,但大腦不一定能馬上反應出**「這個改動會導致資料庫鎖死」**或是**「這裡有一個隱藏的 SQL Injection」**。 > > 於是我想:**為什麼不讓 AI 幫我做第一關的 Risk Review?** [TOC] --- ## 🚀 這是什麼? 這是一個進階版的 PowerShell 自動化腳本。它不只幫你抓出 Git 的差異,還會扮演一位**「資深且機車的資安架構師」**,幫你分析這一次上版可能會把系統搞掛的風險。 **它能做到:** 1. 自動抓取 `Old Commit` 與 `New Commit` 之間的差異 (Diff)。 2. 透過精心設計的 **System Prompt (提示詞)**,讓 AI 專注於找碴。 3. 自動產出一份 **Markdown 風險評估報告**,包含: * 🔥 **阻擋上線的問題** (Showstoppers) * 🛡️ **資安漏洞** (Security Risks) * ⚡ **效能隱憂** (Performance) * 🧪 **QA 測試建議** (Edge Cases) --- ## 🧠 靈魂核心:Prompt 設計 (Prompt Engineering) 要讓 AI 給出有用的建議,而不是只會說「這段程式碼寫得不錯」,關鍵在於 Prompt 的設計。 我將 System Prompt 設定為一位 **DevSecOps 專家**,並加入了**「負向約束」**(叫它不要管縮排、變數命名),強制它專注於**邏輯與安全性**。 以下是腳本中使用的 Prompt 設計: ```markdown 你是一位擁有 20 年經驗的資深軟體架構師與資安專家。 你的核心任務是:「阻止不穩定的版本上線」。 ### 🚫 忽略項目 - 忽略縮排、換行、變數命名美感。 - 忽略單純的註解更新。 ### 🔍 重點審查 (Deep Dive) 1. **破壞性更動**: API 簽章改變?DB Schema 變更後是否相容舊資料? 2. **資安漏洞**: SQL Injection?Hardcoded Secrets?權限繞過? 3. **效能**: N+1 Query?記憶體洩漏? 請輸出嚴格、批判性強的 Markdown 報告。 ``` --- ## 🛠️ 腳本實作 (Copy & Paste 即可用) 請建立一個檔案 `analyze-risk.ps1`,並貼上以下內容。 > **⚠️ 注意**:你需要一組 OpenAI API Key,或是改用 Local LLM (如 Ollama) 的網址。 ```powershell param ( [string]$OldCommit = $(throw "請提供舊版 Commit ID"), [string]$NewCommit = $(throw "請提供新版 Commit ID"), [string]$ApiKey = $env:OPENAI_API_KEY, # 建議設在環境變數 [string]$Model = "gpt-4o" # 建議用 gpt-4 或 gpt-4o 效果較好 ) # 1. 檢查設定 if ([string]::IsNullOrWhiteSpace($ApiKey)) { Write-Host "❌ 錯誤: 未設定 API Key。" -ForegroundColor Red exit 1 } # 2. 準備輸出目錄 $timestamp = Get-Date -Format "yyyyMMddHHmmss" $reportFolder = "risk-reports/$timestamp" New-Item -ItemType Directory -Path $reportFolder -Force | Out-Null Write-Host "🤖 正在擷取 Git 差異 ($OldCommit -> $NewCommit)..." -ForegroundColor Cyan # 3. 取得 Git Diff (含上下文) # --unified=10 提供更多上下文讓 AI 理解邏輯 $diffContent = git diff --unified=10 $OldCommit $NewCommit if (-not $diffContent) { Write-Host "✅ 無程式碼變更。" -ForegroundColor Green exit 0 } # 防呆:避免 Token 爆炸 if ($diffContent.Length -gt 150000) { Write-Host "⚠️ 警告: Diff 過大,可能截斷或產生高額費用。" -ForegroundColor Yellow } Write-Host "🧠 架構師正在審查中 (請稍候)..." -ForegroundColor Cyan # 4. 定義 "機車的" 架構師人格 $systemPrompt = @" 你是一位擁有 20 年經驗的資深軟體架構師與資安專家 (DevSecOps)。 你的核心任務是進行「發佈前風險評估」。 你收到的是一段 Git Diff。 請依循以下框架嚴格審查: ### 🚫 忽略項目 (雜訊過濾) - 忽略純粹的格式調整 (縮排、換行)。 - 忽略變數命名的美感問題。 - 忽略單純的文檔更新。 ### 🔍 重點審查項目 1. **💥 破壞性更動**: API 簽章是否改變?DB Schema 變更是否考慮回滾? 2. **🛡️ 資安漏洞**: SQL Injection?Hardcoded Secrets?權限檢查繞過? 3. **⚡ 效能與穩定性**: 迴圈內呼叫 DB?OOM 風險?例外處理是否吞掉錯誤? ### 📝 輸出格式 (Markdown) 語氣要專業、直接、批判性強 (Critical): # 🛡️ 上版風險評估報告 ## 🚦 綜合風險評分: [🟢低 / 🟡中 / 🔴高 / 🔥極危險] ## 🔥 阻擋上線的問題 (Showstoppers) *(若無則顯示 "無")* - **[檔案]**: 說明為何這裡會導致系統崩潰或資安外洩。 ## ⚠️ 潛在風險與警告 - 說明邏輯漏洞或副作用。 ## ⚡ 效能優化建議 - 指出具體程式碼片段。 ## 🧪 測試建議 - QA 應該特別測試哪些極端情境 (Edge Cases)? "@ # 5. 呼叫 API $apiUrl = "[https://api.openai.com/v1/chat/completions](https://api.openai.com/v1/chat/completions)" # 如果用 Ollama (地端),網址改為: "http://localhost:11434/v1/chat/completions" $headers = @{ "Content-Type" = "application/json" "Authorization" = "Bearer $ApiKey" } $body = @{ model = $Model messages = @( @{ role = "system"; content = $systemPrompt }, @{ role = "user"; content = "Git Diff Content:`n`n$diffContent" } ) temperature = 0.2 # 低溫讓分析更理性 } | ConvertTo-Json -Depth 5 -Compress try { $response = Invoke-RestMethod -Uri $apiUrl -Method Post -Headers $headers -Body $body -TimeoutSec 180 # 6. 產出報告 $reportContent = $response.choices[0].message.content $reportPath = "$reportFolder/Risk_Analysis.md" $reportContent | Out-File -FilePath $reportPath -Encoding utf8 Write-Host "✅ 分析完成!" -ForegroundColor Green if (Get-Command "code" -ErrorAction SilentlyContinue) { code $reportPath } } catch { Write-Host "❌ API 呼叫失敗: $_" -ForegroundColor Red } ``` --- ## 📊 實測結果:AI 真的抓得到嗎? 我故意寫了一段包含 **SQL Injection** 和 **Hardcoded Password** 的爛 Code 去測試,結果 AI 產出的報告非常驚人: ### 📄 Risk_Analysis.md (模擬輸出) > # 🛡️ 上版風險評估報告 > > ## 🚦 綜合風險評分: 🔥 極危險 (不可上版) > > ## 🔥 阻擋上線的問題 (Showstoppers) > - **`src/AuthService.cs`**: > 嚴重資安漏洞!第 45 行使用了字串串接組裝 SQL 指令 (`"SELECT * FROM Users WHERE name = '" + input + "'"` )。這將導致 **SQL Injection** 攻擊,駭客可直接導出整個資料庫。**必須**改為參數化查詢。 > - **`config/appsettings.json`**: > 發現 AWS Secret Key 被直接寫入檔案。這將導致金鑰外洩風險,請立即移除並改用環境變數。 > > ## ⚠️ 潛在風險與警告 > - **`src/OrderController.cs`**: > 修改了 `GetOrder` 的回傳格式,原本回傳 `Array` 現在變為 `Object`。這是一個 **Breaking Change**,請確認所有前端與 App 版本都已適配,否則會導致客戶端報錯。 > > ## 🧪 測試建議 > - 請 QA 針對登入欄位輸入 `' OR '1'='1` 進行攻擊測試。 > - 請驗證舊版 App 在呼叫訂單 API 時是否會 Crash。 --- ## 💡 使用心得與建議 1. **作為 "Pre-Review" 工具**: 我不會完全依賴它,但我會在發 PR 之前自己先跑一次。這就像是讓一個資深前輩先幫你看過,避免犯低級錯誤被釘在牆上。 2. **資安考量 (重要)**: * 如果你的程式碼是商業機密,**請勿**直接傳給公有的 OpenAI API。 * **解法**:公司內部可申請 Azure OpenAI (企業級合規),或者使用 **Ollama** 在地端跑 `llama3` 模型(只需改腳本中的 `$apiUrl` 即可),完全斷網也能分析! ### 下一步? 你可以把這個腳本整合進 CI/CD Pipeline (如 Jenkins / GitHub Actions),每次有人 Push Code 就自動跑風險分析,並將結果貼到 Slack 群組! ---
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up