参数化查询(Parameterized Queries) 能够根除 SQL 注入的本质,在于它将 SQL 指令的**语法编译(Compile)与数据传输(Execute)**彻底解耦,使得传入的恶意攻击载荷无法改变数据库执行引擎生成的抽象语法树(AST)。
一、Java PreparedStatement 正确实现
java
String query = "SELECT id, username, balance FROM accounts WHERE user_id = ? AND status = ?";
try (PreparedStatement pstmt = conn.prepareStatement(query)) {
pstmt.setLong(1, userId);
pstmt.setString(2, "ACTIVE");
ResultSet rs = pstmt.executeQuery();
// 数据库仅将参数作为常量字面量处理,语义不受影响
}