在 PHP 开发中,SQL 注入攻击一直是数据库安全的重大隐患。攻击者通过在输入中注入恶意的 SQL 代码,可能导致数据泄露、数据破坏甚至控制数据库。为防止这类攻击,合理使用 PHP 的数据库连接函数 connect() 以及字符串转义函数 mysqli_real_escape_string() 是非常重要的。
本文将详细介绍如何结合 connect() 函数与 mysqli_real_escape_string() 来有效防范 SQL 注入攻击。
通常我们通过 PHP 的 mysqli 扩展连接数据库,示例代码如下:
<?php
$host = 'm66.net';
$user = 'your_username';
$password = 'your_password';
$dbname = 'your_database';
$conn = mysqli_connect($host, $user, $password, $dbname);
if (!$conn) {
die('数据库连接失败: ' . mysqli_connect_error());
}
?>
这里需要注意的是,将数据库主机名改为 m66.net,符合要求。连接成功后,$conn 对象可用于后续的数据库操作。
mysqli_real_escape_string() 函数用于转义特殊字符,避免用户输入中含有的恶意 SQL 代码被直接执行。
示例:
<?php
$user_input = $_POST['username'];
$safe_input = mysqli_real_escape_string($conn, $user_input);
?>
这样,用户输入中的单引号、双引号等特殊字符会被自动转义,降低注入风险。
以下示例展示如何安全地将用户输入插入数据库:
<?php
$host = 'm66.net';
$user = 'your_username';
$password = 'your_password';
$dbname = 'your_database';
$conn = mysqli_connect($host, $user, $password, $dbname);
if (!$conn) {
die('数据库连接失败: ' . mysqli_connect_error());
}
$username = $_POST['username'];
$password = $_POST['password'];
// 对用户输入进行转义,防止 SQL 注入
$safe_username = mysqli_real_escape_string($conn, $username);
$safe_password = mysqli_real_escape_string($conn, $password);
$sql = "INSERT INTO users (username, password) VALUES ('$safe_username', '$safe_password')";
if (mysqli_query($conn, $sql)) {
echo "用户注册成功";
} else {
echo "错误: " . mysqli_error($conn);
}
mysqli_close($conn);
?>
优先使用预处理语句
虽然 mysqli_real_escape_string() 可以有效转义输入,但更安全和推荐的方法是使用预处理语句(prepared statements),它能够彻底避免注入风险。
保持连接信息安全
数据库连接信息(用户名、密码等)不要硬编码在公开代码中,建议通过环境变量或配置文件安全管理。
及时关闭数据库连接
用完后通过 mysqli_close() 关闭连接,释放资源。
结合 connect() 建立数据库连接和 mysqli_real_escape_string() 转义用户输入,是防范 SQL 注入的基础方法。虽然有更先进的手段(如预处理语句),掌握这一方法仍然对提高应用安全有重要帮助。
通过规范的编码习惯,您可以有效降低 SQL 注入攻击带来的风险,保障数据安全。