一、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注入攻击。