一、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>
        密&nbsp;&nbsp;码:<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实现三步攻击:

  1. 闭合原有 SQL 的单引号
  2. 添加恒成立条件'1'='1'
  3. 注释多余内容,避免语法错误

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

六、本文总结

  1. PHP 与数据库交互四步:建立连接→接收输入→执行 SQL→处理结果
  2. 登录表单必须用POST方式
  3. SQL 注入根源:直接拼接用户输入到 SQL 语句
  4. 万能密码本质:闭合单引号 + 构造恒真条件,绕过登录验证
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐