ubuntu

ubuntu下php如何防止SQL注入

小樊
43
2025-07-29 20:13:33
栏目: 云计算

在 Ubuntu 下使用 PHP 防止 SQL 注入,可以采取以下几种方法:

  1. 使用预处理语句(推荐)

预处理语句是一种防止 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();
  1. 使用 MySQLi 扩展
// 创建 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();
  1. 使用 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 函数作为补充措施。

0
看了该问题的人还看了