通过使用 ?
占位符来创建预编译的 SQL 语句,然后使用 setString
方法来设置参数值。这样做可以确保用户提供的任何输入都被视为字符串值,而不是 SQL 代码的一部分,从而防止 SQL 注入攻击。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class PreventSQLInjection {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/mydatabase";
String username = "myusername";
String password = "mypassword";
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
// 1. 获取数据库连接
conn = DriverManager.getConnection(url, username, password);
// 2. 创建预编译 SQL 语句
String sql = "SELECT * FROM users WHERE username = ? AND password = ?";
pstmt = conn.prepareStatement(sql);
// 3. 设置参数值
pstmt.setString(1, "myinputusername");
pstmt.setString(2, "myinputpassword");
// 4. 执行查询
rs = pstmt.executeQuery();
// 5. 处理结果集
while (rs.next()) {
System.out.println("User found: " + rs.getString("username"));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 6. 关闭连接和结果集对象
try {
if (rs != null) rs.close();
if (pstmt != null) pstmt.close();
if (conn != null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}