在PHP中防止SQL注入是非常重要的安全措施。以下是一些关键步骤和示例代码,用于说明如何在PHP中防止SQL注入:
使用预处理语句(Prepared Statements)和参数化查询
使用预处理语句可以确保用户输入被当作数据处理,而不是SQL代码的一部分。这可以通过PDO(PHP Data Objects)或MySQLi(MySQL Improved)扩展实现。
PDO示例:
php
复制代码
<?php
$host = 'localhost';
$db = 'test';
$user = 'root';
$pass = 'password';
$charset = 'utf8mb4';
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$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, $user, $pass, $options);
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username AND password = :password");
$stmt->bindParam('https://www.plotioglobal-zh.com/trade-strategy', $username);
$stmt->bindParam(':password', $password);
// 假设 $username 和 $password 来自用户输入
$username = $_POST['username'];
$password = $_POST['password']; // 注意:在真实应用中,不应直接存储明文密码
$stmt->execute();
$user = $stmt->fetch();
if ($user) {
// 用户验证成功
} else {
// 用户验证失败
}
} catch (\PDOException $e) {
throw new \PDOException($e->getMessage(), (int)$e->getCode());
}
?>
MySQLi示例:
php
复制代码
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "my_db");
/* 检查连接 */
if ($mysqli->connect_errno) {
printf("Connect failed: %s\n", $mysqli->connect_error);
exit();
}
/* 创建预处理语句 */
if (!($stmt = $mysqli->prepare("SELECT * FROM users WHERE username = ? AND password = ?"))) {
echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
/* 绑定参数并执行 */
$username = $_POST['username'];
$password = $_POST['password']; // 注意:在真实应用中,不应直接存储明文密码
$stmt->bind_param("ss", $username, $password);
/* 执行预处理语句 */
$stmt->execute();
/* 绑定结果变量 */
$result = $stmt->get_result();
if ($result->num_rows == 1) {
// 用户验证成功
} else {
// 用户验证失败
}
/* 关闭语句和连接 */
$stmt->close();
$mysqli->close();
?>
不要使用mysql_*函数
mysql_*函数在PHP 7.0.0中被弃用,并在PHP 7.4.0中被完全移除。这些函数不提供对SQL注入的防护,并且不支持预处理语句。
3. 过滤和转义用户输入
虽然预处理语句是防止SQL注入的首选方法,但在某些情况下,你可能需要手动过滤或转义用户输入。例如,当使用LIKE语句进行模糊查询时。但请注意,仅仅依赖过滤或转义是不够的,应该始终使用预处理语句。
4. 限制数据库用户的权限
确保数据库用户只有执行其所需操作的最小权限。例如,Web应用程序的数据库用户应该只有读取和写入应用程序所需数据的权限,而不应该有删除或修改数据库结构的权限。
5. 使用Web应用程序防火墙(WAF)
虽然这不是PHP代码层面的措施,但使用WAF可以增加额外的安全层,帮助检测和防止SQL注入等攻击。