在SQL注入紧急防护场景下,快速实施参数化查询可按以下步骤进行,下面分别以常见的编程语言和数据库为例说明:
pythonimport mysql.connector
# 建立数据库连接
mydb = mysql.connector.connect(
host="localhost",
user="your_username",
password="your_password",
database="your_database"
)
# 创建游标对象
mycursor = mydb.cursor()
# 定义参数化查询语句
sql = "SELECT * FROM users WHERE username = %s AND password = %s"
# 用户输入的数据
user_input_username = "example_user"
user_input_password = "example_password"
# 执行参数化查询
mycursor.execute(sql, (user_input_username, user_input_password))
# 获取查询结果
results = mycursor.fetchall()
# 关闭游标和数据库连接
mycursor.close()
mydb.close()在上述代码中,%s 是占位符,实际的值通过元组 (user_input_username, user_input_password) 传递给 execute 方法,数据库驱动会自动处理参数,防止SQL注入。
javaimport java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class ParameterizedQueryExample {
public static void main(String[] args) {
try {
// 建立数据库连接
Connection connection = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/your_database", "your_username", "your_password");
// 定义参数化查询语句
String sql = "SELECT * FROM users WHERE username =? AND password =?";
// 创建PreparedStatement对象
PreparedStatement preparedStatement = connection.prepareStatement(sql);
// 设置参数值
preparedStatement.setString(1, "example_user");
preparedStatement.setString(2, "example_password");
// 执行查询
ResultSet resultSet = preparedStatement.executeQuery();
// 处理查询结果
while (resultSet.next()) {
// 处理每一行数据
}
// 关闭资源
resultSet.close();
preparedStatement.close();
connection.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}这里 ? 是占位符,通过 setString 等方法为占位符设置具体的值,JDBC驱动会对参数进行安全处理,避免SQL注入风险。
php<?php
// 建立数据库连接
$mysqli = new mysqli("localhost", "your_username", "your_password", "your_database");
// 检查连接是否成功
if ($mysqli->connect_errno) {
echo "Failed to connect to MySQL: " . $mysqli->connect_error;
exit();
}
// 定义参数化查询语句
$sql = "SELECT * FROM users WHERE username =? AND password =?";
// 创建预处理语句对象
$stmt = $mysqli->prepare($sql);
// 绑定参数
$username = "example_user";
$password = "example_password";
$stmt->bind_param("ss", $username, $password);
// 执行查询
$stmt->execute();
// 获取结果
$result = $stmt->get_result();
// 处理结果
while ($row = $result->fetch_assoc()) {
// 处理每一行数据
}
// 关闭资源
$stmt->close();
$mysqli->close();
?>在上述PHP代码中,? 为占位符,bind_param 方法用于绑定具体的参数值,mysqli 扩展会自动处理参数以防止SQL注入。