在 Ubuntu 下使用 PHP 防止 SQL 注入,可以采取以下几种方法:
预处理语句是一种防止 SQL 注入的有效方法。PHP 提供了 PDO 和 MySQLi 两种扩展来支持预处理语句。以下是使用 PDO 的示例:
// 创建 PDO 实例
$dsn = 'mysql:host=localhost;dbname=your_database;charset=utf8';
$username = 'your_username';
$password = 'your_password';
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];
try {
$pdo = new PDO($dsn, $username, $password, $options);
} catch (PDOException $e) {
die('Connection failed: ' . $e->getMessage());
}
// 预处理 SQL 语句
$sql = 'SELECT * FROM users WHERE username = :username AND password = :password';
$stmt = $pdo->prepare($sql);
// 绑定参数
$stmt->bindParam(':username', $username);
$stmt->bindParam(':password', $password);
// 设置参数值
$username = 'user_input_username';
$password = 'user_input_password';
// 执行预处理语句
$stmt->execute();
// 获取结果
$result = $stmt->fetchAll();
// 创建 MySQLi 实例
$mysqli = new mysqli('localhost', 'your_username', 'your_password', 'your_database');
if ($mysqli->connect_error) {
die('Connection failed: ' . $mysqli->connect_error);
}
// 预处理 SQL 语句
$sql = 'SELECT * FROM users WHERE username = ? AND password = ?';
$stmt = $mysqli->prepare($sql);
if (!$stmt) {
die('Prepare statement failed: ' . $mysqli->error);
}
// 绑定参数
$stmt->bind_param('ss', $username, $password);
// 设置参数值
$username = 'user_input_username';
$password = 'user_input_password';
// 执行预处理语句
$stmt->execute();
// 获取结果
$result = $stmt->get_result();
// 关闭预处理语句和 MySQLi 实例
$stmt->close();
$mysqli->close();
mysqli_real_escape_string
函数虽然这种方法不如预处理语句安全,但在某些情况下仍然可以使用。mysqli_real_escape_string
函数可以将特殊字符转义,从而防止 SQL 注入。
// 创建 MySQLi 实例
$mysqli = new mysqli('localhost', 'your_username', 'your_password', 'your_database');
if ($mysqli->connect_error) {
die('Connection failed: ' . $mysqli->connect_error);
}
// 转义用户输入
$username = $mysqli->real_escape_string('user_input_username');
$password = $mysqli->real_escape_string('user_input_password');
// 构建 SQL 语句
$sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
// 执行 SQL 语句
$result = $mysqli->query($sql);
// 处理结果
if ($result) {
while ($row = $result->fetch_assoc()) {
// 输出数据
}
}
// 关闭 MySQLi 实例
$mysqli->close();
总之,推荐使用预处理语句来防止 SQL 注入,因为它们提供了更高的安全性。在某些情况下,可以使用 mysqli_real_escape_string
函数作为补充措施。