【数据库安全】PHP 与 MySQL 交互 + SQL 注入万能密码原理
·
一、PHP 与数据库交互核心四步
PHP 连接 MySQL 实现登录功能,标准流程只有4 步,也是注入漏洞最易出现的环节。
1. 建立数据库连接
使用mysqli_connect函数建立连接,失败则直接终止程序。
$db_host = '127.0.0.1';
$db_user = 'root';
$db_pass = 'root';
$db_name = 'school';
$conn = mysqli_connect($db_host, $db_user, $db_pass, $db_name);
if (!$conn) {
die("数据库连接失败: " . mysqli_connect_error());
}
2. 接收用户输入
必须使用POST 方式,密码不暴露在 URL 中,更安全。
$name = $_POST['name'];
$pwd = $_POST['password'];
3. 执行 SQL 查询(漏洞核心)
直接拼接用户输入到 SQL 语句,这是 SQL 注入的根本原因。
$sql = "SELECT * FROM users WHERE name='$name' AND password='$pwd'";
$result = mysqli_query($conn, $sql);
4. 处理查询结果
判断结果集行数,决定登录成功或失败。
if (mysqli_num_rows($result) > 0) {
$user_info = mysqli_fetch_assoc($result);
echo "登录成功!欢迎你:" . $user_info['name'];
} else {
echo "登录失败:用户名或密码错误";
}
二、交互四步核心对照表
| 步骤 | 核心操作 | 作用说明 |
|---|---|---|
| 第一步 | mysqli_connect (地址,账号,密码,库名) | 建立 PHP 与数据库连接,失败终止程序 |
| 第二步 | $_POST['name'] / $_POST['password'] | 接收用户输入,POST 比 GET 更安全 |
| 第三步 | 拼接 SQL + mysqli_query 执行 | 漏洞高发区,直接拼接易被注入 |
| 第四步 | mysqli_num_rows 判断结果 | 验证是否匹配用户,返回登录状态 |
三、完整登录代码(带漏洞版)
<?php
// 第一步:建立数据库连接
$db_host = '127.0.0.1';
$db_user = 'root';
$db_pass = 'root';
$db_name = 'school';
$conn = mysqli_connect($db_host, $db_user, $db_pass, $db_name);
if (!$conn) {
die("数据库连接失败: " . mysqli_connect_error());
}
// 接收表单提交
if ($_POST) {
// 第二步:接收用户输入
$name = $_POST['name'];
$pwd = $_POST['password'];
// 第三步:执行SQL查询(存在注入漏洞)
$sql = "SELECT * FROM users WHERE name='$name' AND password='$pwd'";
$result = mysqli_query($conn, $sql);
// 第四步:处理结果
if (mysqli_num_rows($result) > 0) {
$user_info = mysqli_fetch_assoc($result);
echo "登录成功!欢迎你:" . $user_info['name'] . "<br>";
echo "身份证号:" . $user_info['id_card'] . "<br>";
echo "手机号:" . $user_info['phone'];
} else {
echo "登录失败:用户名或密码错误";
}
}
// 关闭连接
mysqli_close($conn);
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>教务系统登录</title>
</head>
<body>
<form method="post">
用户名:<input type="text" name="name"><br><br>
密 码:<input type="password" name="password"><br><br>
<button type="submit">登录</button>
</form>
</body>
</html>
四、SQL 注入漏洞(万能密码)原理
1. 漏洞根源
核心问题代码:
$sql = "SELECT * FROM users WHERE name='$name' AND password='$pwd'";
- 直接将用户输入拼接到 SQL 语句
- 未过滤
'、OR、#等特殊字符 - 未做转义处理,攻击者可恶意篡改 SQL 逻辑
2. 万能密码底层逻辑
攻击者输入:' or '1'='1实现三步攻击:
- 闭合原有 SQL 的单引号
- 添加恒成立条件
'1'='1' - 注释多余内容,避免语法错误
3. 篡改前后 SQL 对比
- 正常 SQL:
SELECT * FROM users WHERE name='admin' AND password='123'
- 注入后 SQL:
SELECT * FROM users WHERE name='' or '1'='1' AND password=''
WHERE 条件恒成立,数据库返回所有用户,直接登录成功。
五、数据库基础:SQL 的 CRUD
1. 创建数据库与表
CREATE DATABASE school CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
id_card VARCHAR(18) NOT NULL,
phone VARCHAR(11) NOT NULL,
address TEXT,
password VARCHAR(50) NOT NULL
);
2. SQL 四大操作
| 操作 | 英文 | 语句 |
|---|---|---|
| 新增 | Create | INSERT INTO ... VALUES |
| 查询 | Read | SELECT * FROM ... |
| 修改 | Update | UPDATE ... SET ... WHERE |
| 删除 | Delete | DELETE FROM ... WHERE |
六、本文总结
- PHP 与数据库交互四步:建立连接→接收输入→执行 SQL→处理结果
- 登录表单必须用POST方式
- SQL 注入根源:直接拼接用户输入到 SQL 语句
- 万能密码本质:闭合单引号 + 构造恒真条件,绕过登录验证
更多推荐



所有评论(0)