在PHP中防止MySQL注入攻击,最有效的方法是使用预处理语句(Prepared Statements),它能彻底分离SQL逻辑和用户输入数据,以下是两种主流实现方式:

方法1:使用 PDO(推荐)
<?php
// 数据库配置
$host = 'localhost';
$dbname = 'your_database';
$user = 'root';
$pass = '';
try {
// 创建PDO连接,启用错误报告和预处理模拟
$pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $user, $pass, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => false // 禁用模拟预处理,强制使用真正的预处理
]);
// 用户输入(示例)
$username = $_POST['username'];
$email = $_POST['email'];
// 1. 准备SQL模板(使用命名占位符)
$stmt = $pdo->prepare("INSERT INTO users (username, email) VALUES (:username, :email)");
// 2. 绑定参数(自动过滤类型)
$stmt->bindParam(':username', $username, PDO::PARAM_STR);
$stmt->bindParam(':email', $email, PDO::PARAM_STR);
// 3. 执行语句
$stmt->execute();
echo "数据安全写入!";
} catch (PDOException $e) {
die("数据库错误: " . $e->getMessage()); // 生产环境应记录日志而非直接输出
}
?>
方法2:使用 MySQLi
<?php
$host = 'localhost';
$user = 'root';
$pass = '';
$dbname = 'your_database';
// 创建连接
$mysqli = new mysqli($host, $user, $pass, $dbname);
if ($mysqli->connect_error) {
die("连接失败: " . $mysqli->connect_error);
}
// 用户输入
$username = $_POST['username'];
$email = $_POST['email'];
// 1. 准备SQL模板
$stmt = $mysqli->prepare("INSERT INTO users (username, email) VALUES (?, ?)");
// 2. 绑定参数(s=字符串, i=整数, d=浮点数, b=二进制)
$stmt->bind_param('ss', $username, $email); // 两个字符串
// 3. 执行
if ($stmt->execute()) {
echo "数据安全写入!";
} else {
echo "错误: " . $stmt->error;
}
// 关闭连接
$stmt->close();
$mysqli->close();
?>
🛡️ 关键安全原则
-
永远不要拼接用户输入到SQL中
// 高危!绝对禁止! $sql = "SELECT * FROM users WHERE name = '{$_POST['name']}'"; -
预处理语句是黄金标准
PDO/MySQLi的预处理能确保用户输入被当作纯数据处理,而非可执行代码。
-
辅助防护措施:
- 输入验证:检查数据格式(如邮箱正则)
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { die("无效邮箱"); } - 最小权限原则:数据库账号仅赋予必要权限(禁止DROP等)。
- 错误处理:生产环境关闭错误回显(避免泄露敏感信息)。
- 输入验证:检查数据格式(如邮箱正则)
❌ 过时/不安全的方案(切勿使用)
mysql_*函数(已废弃,无注入防护)mysqli_real_escape_string()
(需手动处理引号,易漏且不能用于数值/表名)addslashes()
(完全不可靠,无法防御多字节注入)
| 方案 | 安全性 | 易用性 | 数据库兼容性 |
|---|---|---|---|
| PDO预处理 | 支持多种数据库 | ||
| MySQLi预处理 | 仅MySQL | ||
| 手动转义(不推荐) | 依赖数据库 |
最佳实践:优先选择PDO预处理语句,兼顾安全性与跨数据库能力。

图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/295880.html

