我的个人网站:乐乐主题创作室
SQL注入(SQL Injection)是Web应用中最常见且危害极大的安全漏洞之一。作为PHP开发者,掌握防范SQL注入的技术至关重要。本文将深入探讨SQL注入的原理、危害以及PHP中多种防御手段,并提供生产级别的代码示例。
SQL注入是一种通过在用户输入中插入恶意SQL代码来操纵后端数据库的技术。攻击者可以利用此漏洞查看、修改或删除数据库中的敏感数据,甚至获得系统权限。
-- 经典注入示例
SELECT * FROM users WHERE username = 'admin' -- ' AND password = '...'
-- 联合查询注入
SELECT * FROM products WHERE id = 1 UNION SELECT username, password FROM users
-- 基于时间的盲注
SELECT * FROM users WHERE username = 'admin' AND IF(1=1,SLEEP(5),0) -- '
预处理语句是防范SQL注入最有效的方法。PHP的PDO和MySQLi扩展都支持预处理。
// 创建PDO连接
$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 预处理SQL语句
$stmt = $pdo->prepare('SELECT * FROM users WHERE username = :username AND password = :password');
// 绑定参数
$username = $_POST['username'];
$password = $_POST['password'];
$stmt->bindParam(':username', $username, PDO::PARAM_STR);
$stmt->bindParam(':password', $password, PDO::PARAM_STR);
// 执行查询
$stmt->execute();
// 获取结果
$user = $stmt->fetch(PDO::FETCH_ASSOC);
// 创建MySQLi连接
$mysqli = new mysqli('localhost', 'username', 'password', 'test');
// 检查连接
if ($mysqli->connect_error) {
die('连接失败: ' . $mysqli->connect_error);
}
// 预处理
$stmt = $mysqli->prepare('SELECT * FROM users WHERE username = ? AND password = ?');
// 绑定参数
$username = $_POST['username'];
$password = $_POST['password'];
$stmt->bind_param('ss