譯者 | 核子可樂
審校 | 重樓
隨著市場熱情接納ChatGPT、Claude、Cursor和GitHub Copilot等AI驅動編程智能體的過程中,許多開發者似乎忘記了一個基本事實:代碼的意義不止在于是否有效,更應重視安全性、可靠性與可維護性。
本文將結合實踐經驗,探討AI輔助開發可能造成的隱患,并提供清晰可行的規避策略。
風險一:看似正確的代碼卻可能埋下“暗雷”
AI往往會生成語法正確、能夠順利編譯及運行,但在特定條件下卻會引發行為異常的代碼。
真實案例:AI建議的函數中暗藏數據損壞風險。
// 由AI生成
function updateInventory(itemId, quantity) {
db.items.find({ id: itemId }).quantity += quantity;
}
看著沒毛病,對吧?但其不會更新數據庫——因為find()返回的是副本,而非引用。這可能會悄悄破壞整個生產環境中的數據邏輯。
修復:
await db.items.updateOne({ id: itemId }, { $inc: { quantity } });
規避方法: 堅持驗證所使用數據模型及數據庫方法。請記住,AI無法識別你的數據架構。
風險二:上下文缺失導致的安全漏洞
AI經常會忽略掉關鍵上下文,例如身份驗證、授權與數據清洗,這些問題在動態路由或表單中體現得尤其明顯。
真實案例:Admin Route中未進行授權檢查。
app.get('/admin/export', async (req, res) => {
const data = await getSensitiveData();
res.send(data);
});
沒有中間件、也沒有訪問控制,因此該路由可能在生產環境中暴露。
修復:
app.get('/admin/export', isAuthenticated, isAdmin, async (req, res) => {
const data = await getSensitiveData();
res.send(data);
});
規避方法:添加安全提示詞,而后手動檢查各路由的訪問控制。
風險三:使用不受信的輸入進行依賴項注入
AI可能在不知不覺中建議將用戶控制的變量注入至不安全的上下文當中。
真實案例:通過未轉義的變量進行模板注入
res.send(`<div>Hello ${req.query.name}</div>`);
If nameis <script>alert(1)</script>, you've got XSS.
修復:
const escape = require('escape-html');
res.send(`<div>Hello ${escape(req.query.name)}</div>`);
規避方法:
切勿盲目信任由用戶輸出生成的輸出——注意進行轉義或代碼凈化。
如何避免落入上述陷阱
- 謹慎處理提示詞: 在提示詞中包含“安全”、“可靠”、“類型檢查”及“慣用”等術語。
- 審查所有內容: 默認所有內容都無法達到生產環境要求。審查代碼的正確性、安全性及上下文。
- 結合靜態分析: 使用ESLint、SonarQube或SAST等工具來捕捉結構性缺陷。
- 編寫測試(配合AI):要求AI生成邊緣用例測試,而后自動擴展。
- 注意,AI只是我們的輔助“大腦”,而非輔助工程師。
寫在最后
AI智能體的確擅長提出新思路并顯著提升效率。然而,在代碼的安全性和可維護性方面,人類仍將長期占據主導。
總之,請相信你自己的判斷,而非過度依賴自動補全。
原文標題:The Hidden Risks of Coding with AI Agents (and How to Avoid Them),作者:Irvan Gerhana Septiyana