mysql防止表单注入

一、mysqli
MySQL防止表单注入的主要方法是使用预处理语句(prepared statements),这通常与参数化查询结合使用。预处理语句可以防止SQL注入,因为它们不将用户输入直接拼接到SQL语句中。
以下是使用MySQL预处理语句的示例代码:

// 假设已经建立了数据库连接
$mysqli = new mysqli("localhost", "username", "password", "database");
 
// 检查连接是否成功
if ($mysqli->connect_error) {
    die("连接失败: " . $mysqli->connect_error);
}
 
// 预处理一个SQL语句
$stmt = $mysqli->prepare("INSERT INTO table_name (column1, column2) VALUES (?, ?)");
 
// 绑定参数
$param1 = "value1";
$param2 = "value2";
$stmt->bind_param("ss", $param1, $param2);
 
// 执行语句
$stmt->execute();
 
// 关闭语句
$stmt->close();
 
// 关闭连接
$mysqli->close();

实例:

<pre>// 数据库配置
$servername = "localhost";
$username = "root";
$password = "root";
$dbname = "fin";
$table = "fin";

// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);

// 检查连接
if ($conn->connect_error) {
    die("连接失败: " . $conn->connect_error);
}

</pre>
<pre>$stmt = $conn->prepare("INSERT INTO `$table` (`issue`,`award_date`,`first`,`second`,`third`,`fourth`,`fifth`) VALUES (?, ?, ?, ?, ?, ?, ?)");
$stmt->bind_param("sissssi", $issue, $award_date, $numbers[0], $numbers[1], $numbers[2], $numbers[3], $numbers[4]);

if ($stmt->execute()) {
    echo "\n插入一行数据,期号是:{$issue}, 开奖号码是:{$numbers[0]}{$numbers[1]}{$numbers[2]}{$numbers[3]}{$numbers[4]}, 开奖日期是:{$award_date}\n";
} else {
    echo "Error: " . $stmt->error;
}

$stmt->close();</pre>

在这个例子中,我们使用了问号(?)作为占位符,并且使用bind_param方法将实际的变量绑定到占位符上。这样,用户的输入就不会直接影响SQL语句结构,从而防止了SQL注入攻击。

二、pdo
为了防止SQL注入,你应该使用预处理语句(prepared statements)与参数化查询,这样可以确保数据在插入数据库之前不会被解释为SQL代码的一部分。
以下是一个使用PDO(PHP Data Objects)扩展来防止SQL注入的例子:

try {
    // 创建PDO实例
    $pdo = new PDO('mysql:host=your_host;dbname=your_db', 'username', 'password');
    
    // 设置错误模式为异常
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    // 预处理SQL语句
    $stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username");
    
    // 绑定参数
    $stmt->bindParam(':username', $username);
    
    // 从用户那里获取数据并执行查询
    $username = $_GET['username']; // 假设从GET参数中获取
    $stmt->execute();
    
    // 获取结果
    $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
    // 处理结果
    foreach ($result as $row) {
        // ...
    }
} catch (PDOException $e) {
    // 处理异常
    echo "Error: " . $e->getMessage();
}

在这个例子中,:username 是一个参数,它被绑定到实际的变量 $username。当执行查询时,$username 的内容会被当作参数的值,而不是SQL指令的一部分,从而防止了SQL注入攻击。

Posted in PHP