当前位置: 首页 > news >正文

PHP+MySQL开发实战:从数据库操作到SQL注入漏洞原理解析

前言
Web开发是网络安全学习的重要基础,只有深入理解Web应用的开发原理,才能真正掌握漏洞的成因和利用方法。本文将从PHP编程入门开始,系统介绍phpMyAdmin的使用、数据库增删改查操作、PHP与HTML混合编程,最后深入剖析SQL注入漏洞的产生原理,帮助读者建立从开发到安全的完整知识体系。

文章目录

  • 公网部署的实战价值
    • 虚拟机与公网环境的区别
    • 国内外服务器选择
    • 技术商业化思考
  • PHP编程语言选择
    • 主流编程语言对比
    • PHP在Web开发中的定位
  • phpMyAdmin数据库管理
    • 环境搭建
    • 数据库与表的创建
      • 创建数据库
      • 创建数据表
      • 插入测试数据
    • 开发环境配置
  • PHP数据库操作实战
    • 数据库连接
    • 查询操作(SELECT)
    • 插入操作(INSERT)
    • 更新操作(UPDATE)
    • 删除操作(DELETE)
    • 关闭连接
  • PHP与HTML混合编程
    • HTML基本结构
    • 表格美化显示
  • 命令行数据库操作
    • 连接MySQL
    • 常用SQL命令
  • SQL注入漏洞原理
    • 漏洞产生的根本原因
    • 漏洞触发条件
    • 生产环境与实验环境差异
    • SQL注入实战案例
    • 代码层面的漏洞分析
    • 估算目标数据库语法
  • 数据库架构理解
    • 层级结构
    • 基本操作类型
  • 安全防护建议
    • 开发者防护措施
    • 运维安全措施
  • 实践任务与技能提升
    • 基础实践
    • 进阶学习
  • 总结

公网部署的实战价值

虚拟机与公网环境的区别

虚拟机环境特点

  • 完全隔离,适合学习基础
  • 无法体验真实网络环境
  • 缺少实际部署经验

公网服务器优势

  • 真实的网络环境和性能测试
  • 完整的商业化部署流程
  • 积累运维和安全加固经验

国内外服务器选择

国内云服务商(阿里云、腾讯云):

  • 优点:速度快、稳定性好
  • 缺点:需要备案、提交身份材料、流程繁琐

国外VPS服务商

  • 优点:无需备案、部署快速
  • 缺点:需要信用卡支付、国内访问速度较慢

实践建议: 在国外服务器进行技术实验,避免备案困扰,积累公网部署经验为技术商业化打下基础。

技术商业化思考

商业化能力验证

  • 虚拟机成功 ≠ 公网成功
  • 公网成功 ≠ 可量产

商业化途径

  • 猪八戒威客网:接受外包项目
  • 企业网站建设:为中小企业提供建站服务
  • 技术咨询服务:提供安全评估和加固方案

PHP编程语言选择

主流编程语言对比

C/C++

  • 偏底层、嵌入式开发
  • 性能最优
  • 学习曲线陡峭
  • 适合对性能有极致要求的场景

Java

  • 外包公司主流语言
  • 企业级应用开发
  • 框架生态成熟
  • 适合大型项目

PHP

  • Web开发专用语言
  • 上手快速、开发效率高
  • 全球大量网站使用(如Facebook早期)
  • 适合快速开发中小型Web应用

Python

  • 语法简洁、易学易用
  • 适合用户量50-100万以下的应用
  • 高并发场景CPU效率不高
  • 超过并发瓶颈时需要考虑其他语言

Node.js

  • JavaScript服务端运行环境
  • 异步非阻塞I/O
  • 适合高并发、实时应用

PHP在Web开发中的定位

前后端技术栈

前端:HTML + CSS + JavaScript
后端:PHP + MySQL

PHP特点

  • 弱类型语言(变量以$符号开头)
  • C语言的Web版本
  • 嵌入HTML的能力强
  • 5分钟快速入门

phpMyAdmin数据库管理

环境搭建

PHPStudy配置

  1. 启动Apache和MySQL服务
  2. 进入软件管理,安装phpMyAdmin
  3. 将文件夹名称改为phpmyadmin
  4. 访问 http://127.0.0.1/phpmyadmin/

登录凭证

用户名:root
密码:root

访问原理: 实际访问的是phpmyadmin目录下的index.php文件。

数据库与表的创建

创建数据库

-- 数据库名称
CREATE DATABASE haha;

创建数据表

表名:table1 字段数:4

字段定义

字段名数据类型特殊属性
idINT主键、自增(A_I)
usernameTEXT-
passwordTEXT-
jobTEXT-

主键概念

  • 唯一标识符:每条记录的唯一ID
  • 索引优化:加快查询速度
  • 自增特性:新增记录时自动分配ID

现实案例: QQ号就是腾讯数据库中的用户ID,表示你是第几个注册的用户。

插入测试数据

INSERT INTO table1 (username, password, job) VALUES
('user1', '123', 'farmer'),
('user2', 'mima2', 'driver'),
('user3', 'mima3', 'teacher'),
('user4', 'mima4', 'ceo');

开发环境配置

推荐编辑器:Visual Studio Code

必装插件

  1. Chinese (Simplified) Language Pack - 中文界面
  2. HTML CSS Support (v1.13.1) - HTML/CSS支持
  3. JavaScript (ES6) code snippets (v1.8.0) - JS代码提示
  4. PHP Intelephense (v1.8.2) - PHP智能提示

PHP数据库操作实战

数据库连接

<?php
$servername = "localhost";  // 服务器地址(127.0.0.1)
$username = "root";         // 数据库用户名
$password = "root";         // 数据库密码
$dbname = "haha";           // 数据库名称// 创建连接(面向对象方式)
$conn = new mysqli($servername, $username, $password, $dbname);// 检测连接
if($conn->connect_error) {die("连接失败:" . $conn->connect_error);
}
// 没有错误信息说明连接成功
?>

技术要点

  • localhost:本地主机,等同于127.0.0.1
  • mysqli:MySQL改进扩展,支持面向对象和过程化两种风格
  • 错误处理:使用die()函数中止脚本并输出错误信息

查询操作(SELECT)

<?php
// 准备SQL查询语句
$sql = "SELECT * FROM table1 WHERE id < 3";
// SELECT * - 选择所有列
// FROM table1 - 从table1表中查询
// WHERE id < 3 - 筛选条件// 执行查询
$result = $conn->query($sql);// 检查结果
if($result->num_rows > 0) {// 遍历结果集while($row = $result->fetch_assoc()) {echo $row['id'] . '-----' . $row['username'] . '------' . $row['job'] . '<br/>';}
} else {echo "0结果";
}
?>

WHERE子句高级用法

-- 多条件查询(AND)
SELECT * FROM table1 WHERE id > 1 AND id < 4;-- 多条件查询(OR)
SELECT * FROM table1 WHERE username='user1' OR username='user2';-- 不加WHERE返回所有数据
SELECT * FROM table1;

对象属性说明

  • num_rows:结果集中的记录数
  • field_count:字段数量
  • fetch_assoc():获取关联数组形式的结果

插入操作(INSERT)

<?php
$sql = "INSERT INTO table1 (username, password, job) VALUES('user5', 'mima55', 'cfo')";if($conn->query($sql) === TRUE) {echo "新记录插入成功";
} else {echo "插入失败:" . $conn->error;
}
?>

应用场景

  • 用户注册功能
  • 发布文章、评论
  • 订单创建

安全提示: 实际应用中应该从GET或POST获取用户输入,而非硬编码。

更新操作(UPDATE)

<?php
$sql = "UPDATE table1 SET password='mima598' WHERE username='user5'";if($conn->query($sql) === TRUE) {echo "修改成功";
} else {echo "修改失败:" . $conn->error;
}
?>

安全警告

-- 危险操作:不加WHERE会修改所有记录
UPDATE table1 SET password='123456';-- 安全操作:使用WHERE限定范围
UPDATE table1 SET password='123456' WHERE id=5;

删除操作(DELETE)

<?php
$sql = "DELETE FROM table1 WHERE username='user5'";if($conn->query($sql) === TRUE) {echo "删除成功";
} else {echo "删除失败:" . $conn->error;
}
?>

注意事项

  • 删除操作不可恢复,务必谨慎
  • 必须使用WHERE子句限定删除范围
  • 即使删除不存在的记录也会返回"成功"

关闭连接

<?php
// 操作完成后关闭数据库连接
$conn->close();
?>

专业规范

  • 及时关闭连接释放资源
  • 避免高并发时连接池耗尽
  • 防止数据库崩溃

PHP与HTML混合编程

HTML基本结构

<html>
<head><title>我是网页</title>
</head>
<body><!-- 页面内容 -->
</body>
</html>

标签说明

  • html:根标签,包含整个网页
  • head:头部信息(标题、样式、脚本)
  • body:主体内容(用户可见部分)

表格美化显示

<html>
<head><title>用户信息查询</title>
</head>
<body><?php
$servername = "localhost";
$username = "root";
$password = "root";
$dbname = "haha";// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);// 检测连接
if($conn->connect_error) {die("连接失败:" . $conn->connect_error);
}// 查询语句
$sql = "SELECT * FROM table1 WHERE id < 4";
$result = $conn->query($sql);if($result->num_rows > 0) {// 创建表格echo "<table border='1'>";echo "<tr><th>ID</th><th>用户名</th><th>职业</th></tr>";// 遍历数据while($row = $result->fetch_assoc()) {echo "<tr>";echo "<td>" . $row['id'] . "</td>";echo "<td>" . $row['username'] . "</td>";echo "<td>" . $row['job'] . "</td>";echo "</tr>";}echo "</table>";
}$conn->close();
?></body>
</html>

HTML表格标签

  • table:表格容器
  • tr:表格行(table row)
  • th:表头单元格(table header)
  • td:数据单元格(table data)
  • border=‘1’:添加边框

现代开发方式: 实际项目中通常采用前后端分离架构,PHP框架(如Laravel、ThinkPHP)会自动处理视图渲染,无需手动混写。

命令行数据库操作

连接MySQL

# 进入MySQL安装目录的bin文件夹
cd C:\phpstudy_pro\Extensions\MySQL5.7.26\bin# 在地址栏输入cmd可直接打开当前目录的命令行# 连接数据库
mysql -uroot -proot

参数说明

  • -u:指定用户名
  • -p:指定密码

常用SQL命令

-- 查看所有数据库
SHOW DATABASES;-- 使用指定数据库
USE haha;-- 查看当前数据库的所有表
SHOW TABLES;-- 查询表中所有数据
SELECT * FROM table1;-- 查询指定字段
SELECT username, job FROM table1;-- 条件查询
SELECT * FROM table1 WHERE id < 4;

语法规范

  • SQL语句以分号结尾
  • 关键字建议大写(便于区分)
  • 表名、字段名小写

SQL注入漏洞原理

漏洞产生的根本原因

核心问题:用户输入与数据库交互

// 安全代码(数据写死)
$sql = "SELECT * FROM table1 WHERE id < 4";

上述代码没有漏洞,因为查询条件是固定的。

// 存在漏洞的代码(用户可控)
$id = $_GET['id'];
$sql = "SELECT * FROM table1 WHERE id < $id";

当用户可以控制查询参数时,就可能产生SQL注入漏洞。

漏洞触发条件

用户输入场景

  • GET参数:?id=4
  • POST表单提交
  • Cookie值
  • HTTP头部信息

危险操作

// 带引号的参数
$sql = "SELECT * FROM table1 WHERE username='$username'";

如果用户输入包含单引号:

?username=admin' OR '1'='1

实际执行的SQL变成:

SELECT * FROM table1 WHERE username='admin' OR '1'='1'

破坏引号闭合

?id=4'
?id=4\

这些输入会破坏SQL语句结构,导致:

  • 数据库报错
  • 泄露数据库结构信息
  • 执行恶意SQL语句

生产环境与实验环境差异

PHPStudy实验环境

  • 默认关闭错误显示
  • 便于学习和测试
  • 不会暴露敏感信息

靶场环境

  • 故意开启错误显示
  • 方便学习漏洞利用
  • 模拟不安全的配置

生产环境

  • 应该关闭错误显示
  • 记录日志但不向用户展示
  • 使用通用错误页面

SQL注入实战案例

靶场源代码地址:https://github.com/Audi-1/sqli-labs

下载源码之后在Linux或者Windows系统上自行搭建

测试目标: 获取数据库中的所有用户信息

基础测试

http://[本地IP]/sqli-labs-master/Less-1/?id=2
http://[本地IP]/sqli-labs-master/Less-1/index.php?id=2

攻击思路

  1. 判断注入点存在性
  2. 确定字段数量
  3. 获取数据库信息
  4. 提取表名和字段名
  5. 导出敏感数据

代码层面的漏洞分析

后端处理逻辑

<?php
$id = $_GET['id'];
$sql = "SELECT username, password FROM table1 WHERE id = $id";
$result = $conn->query($sql);
?>

正常请求

?id=1
执行:SELECT username, password FROM table1 WHERE id = 1

恶意请求

?id=1 OR 1=1
执行:SELECT username, password FROM table1 WHERE id = 1 OR 1=1
结果:返回所有记录

估算目标数据库语法

数据库语法差异: 不同数据库有不同的SQL方言:

  • MySQL:使用反引号、LIMIT语法
  • SQL Server:使用方括号、TOP语法
  • Oracle:使用ROWNUM
  • PostgreSQL:使用双引号

判断数据库类型: 通过错误信息、特定函数、语法差异来判断。

数据库架构理解

层级结构

MySQL服务器
└── 数据库(Database)└── 数据表(Table)└── 数据列(Column)└── 数据行(Row)

示例

服务器:localhost
├── haha数据库
│   └── table1表
│       ├── id列
│       ├── username列
│       ├── password列
│       └── job列

基本操作类型

CRUD操作

  • Create - 增加(INSERT)
  • Read - 查询(SELECT)
  • Update - 修改(UPDATE)
  • Delete - 删除(DELETE)

这四个操作构成了数据库的基本功能。

安全防护建议

开发者防护措施

1. 使用预编译语句

// 不安全的方式
$sql = "SELECT * FROM users WHERE id = " . $_GET['id'];// 安全的方式(预编译)
$stmt = $conn->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param("i", $_GET['id']);
$stmt->execute();

2. 输入验证

// 验证输入是否为数字
$id = intval($_GET['id']);
if($id <= 0) {die("无效的ID");
}

3. 转义特殊字符

$username = mysqli_real_escape_string($conn, $_GET['username']);

4. 最小权限原则

  • 数据库账户只给予必要权限
  • 避免使用root账户连接应用
  • 分离读写权限

5. 错误处理

// 不要向用户显示详细错误信息
try {$result = $conn->query($sql);
} catch (Exception $e) {error_log($e->getMessage());die("系统错误,请联系管理员");
}

运维安全措施

1. 关闭错误显示

// php.ini配置
display_errors = Off
log_errors = On

2. 使用Web应用防火墙

  • ModSecurity
  • 云WAF服务
  • 自定义防护规则

3. 定期安全审计

  • 代码审查
  • 渗透测试
  • 漏洞扫描

实践任务与技能提升

基础实践

  1. 搭建本地环境
    • 安装PHPStudy
    • 配置phpMyAdmin
    • 创建测试数据库
  2. 掌握SQL基础
    • 熟练使用增删改查
    • 理解WHERE子句
    • 学习JOIN连接查询
  3. PHP编程练习
    • 完成数据库连接
    • 实现CRUD操作
    • 尝试PHP与HTML混写

进阶学习

  1. SQL注入深入研究
    • 在靶场环境练习
    • 学习SQLMap工具
    • 理解不同注入类型
  2. 安全编码实践
    • 使用预编译语句
    • 实现输入验证
    • 学习安全框架
  3. 框架学习
    • Laravel(PHP)
    • Django(Python)
    • Spring Boot(Java)

总结

PHP与MySQL的结合是Web开发的经典组合,通过本文的学习,读者应该能够:

  1. 理解数据库基本概念:掌握库、表、列、行的层级关系
  2. 掌握CRUD操作:熟练使用增删改查四种基本操作
  3. 实现PHP数据库交互:能够编写完整的数据库操作代码
  4. 理解SQL注入原理:明白漏洞是如何产生的
  5. 具备基本安全意识:知道如何防护常见漏洞

从开发者的角度理解安全问题,是成为优秀安全工程师的必经之路。只有知道如何构建系统,才能更好地发现和利用其中的漏洞。同时,这种双向的知识体系也为技术商业化提供了坚实基础。

重要提醒:本文介绍的SQL注入知识仅供学习和合法授权的安全测试使用。在实际工作中,应当遵循安全编码规范,保护用户数据安全。未经授权的渗透测试和攻击行为违反法律法规,将承担相应法律责任。

http://www.dtcms.com/a/487511.html

相关文章:

  • 【MySQL】管理
  • 计算机视觉(opencv)——基于 MediaPipe 人体姿态检测
  • Spring ApplicationEventPublisher 异步处理与消息队列全面解析
  • 站长网站被跳转怎么办WordPress怎么去掉主题也没
  • 自定义View —> 项目中遇到的复杂UI
  • 网站中信息更新怎么做的烟台建网站
  • IIS发版各接口慢排查
  • 【操作系统核心详解】段式存储与页式存储:区别、碎片及虚拟内存的本质
  • 网站导航图怎么做网站建设邀标比选
  • 杭州网站建设出名企业网站推广技巧有哪些
  • 优质中药饮片供应是什么?主要涵盖哪些关键质量标准?
  • 代码随想录第36天第37天 | 01背包应用 及 完全背包⭐
  • 【GUI自动化测试】Python logging 日志模块与 Allure 测试报告实战指南
  • 两阶段随机规划为电力市场注入智慧
  • 公路工程项目管理软件选型指南
  • 潍坊高端网站设计官网搭建平台
  • 电商网站 开发费用山东建设网站首页
  • JDK 8u5 Windows 64位安装教程(详解,含环境变量配置)​
  • 四川城市建设住建厅网站百度官网认证入口
  • 黑马商城day3-微服务01
  • Flutter---两种带输入框的对话框
  • 自己做的网站怎么在移动端访问网站引导插件
  • 做网站的核验单 是下载的吗网站开发和网络设计有什么区别
  • AR模型(自回归模型)
  • 分布式系统相关知识总结
  • 越南k线历史数据、IPO新股股票数据接口文档
  • JavaScript的书写位置和注释
  • 【Java零基础·第6章】面向对象(二):构造器、封装、对象数组
  • 网站 系统设置建筑工程包括哪些项目
  • 重庆专业网站推广报价怎么做刷会员的网站