学完 Python 自动化,我们进入数据库安全方向。SQL 注入是 Web 安全中最经典的漏洞,而理解 SQL 注入的前提,是先掌握数据库本身。这一篇从 MySQL 基础开始:数据库与 DBMS 的概念、表/记录/字段等基础对象、命令行连接、SQL 四大分类、CRUD 增删改查和 UNION 联合查询。掌握这些查询能力,后续理解注入原理和数据枚举就是水到渠成的事。
一、数据库基本概念
1.1 什么是数据库
数据库(Database)是按照一定结构组织、存储和管理数据的集合,用于高效保存、查询、修改和维护大量数据。可以形象地比喻为一座大型图书馆:书籍是数据记录,分类编号是索引,图书管理员就是数据库管理系统(DBMS)。
为什么需要数据库:与 Excel 或文本文件相比,数据库更适合存储大量数据、多人同时访问、按条件快速检索、保证数据一致性,以及进行权限管理和审计。
1.2 什么是 DBMS【重点】
数据库本身只是数据的集合,而真正负责"创建数据库、管理用户、执行 SQL、控制权限、存储数据、返回查询结果"的软件,叫做 DBMS(Database Management System,数据库管理系统)。
没有 DBMS,就无法完成:创建库表、读写数据、权限管控、事务并发、备份恢复。
1.3 常见 DBMS
| MySQL | 开源、免费、轻量、资料多、上手快 | 网站、CMS、教务系统、论坛、电商 |
| SQL Server / MSSQL | 微软开发,与微软生态深度集成 | Windows 生态、部分政企内网系统 |
| Oracle | 功能强、体系重、运维成本高 | 银行、运营商、大型传统企业 |
| PostgreSQL | 开源能力强、标准兼容性好 | 中大型业务、GIS、数据平台 |
| SQLite | 轻量级嵌入式数据库,无需独立服务 | 单机程序、移动端、本地缓存 |
国产数据库:达梦(DM)、OceanBase、PolarDB、TiDB、GaussDB、人大金仓等,常见于政企、信创替代、金融级业务等场景。
本课只学习关系型数据库,非关系型(Redis、MongoDB)不涉及。
1.4 为什么用 MySQL
MySQL 不是唯一需要掌握的数据库,但是数据库安全学习的最优入门数据库。
二、数据库基础对象【重点】
| 表(Table) | 由行和列组成的二维结构,用于存储结构化数据 | 同类数据的存储结构 |
| 记录(Record/Row) | 表格中的每一行,代表一个独立的数据实例 | 表内单行数据 |
| 字段(Field/Column) | 表格中的每一列,定义数据的属性类型 | 表内单列属性 |
| 主键(Primary Key) | 唯一标识表中每一条记录,必须唯一且不可为空 | 定位单行 |
| 外键(Foreign Key) | 建立并强制两个表之间链接的字段 | 多表关联纽带 |
| 索引(Index) | 加速查询的特殊数据结构,类似书籍目录 | 提速查询 |
主键不能重复、不能为 NULL;外键如 students.class_id 关联 classes.class_id;索引不改变原始数据。三者核心作用:主键=定位单行、外键=表关联、索引=提速查询。
三、环境搭建与连接 MySQL
3.1 测试环境
- 集成环境:phpStudy 中的 MySQL 5.7
- 连接方式:Navicat + mysql 命令行
- MySQL 默认端口:3306
- 默认管理员账号:root
本课以 MySQL 5.7 为准,个别函数和系统表在 MySQL 8.0 中存在差异(8.0 移除 password 字段、information_schema 部分表字段变更),后续注入靶场优先选用 5.7。
3.2 图形化连接工具
Navicat 是最流行的商业数据库管理工具之一。核心原理:所有图形化点击操作,底层都会转化为原生 SQL 语句【重点】。
3.3 命令行连接【实操必考】
# 连接本地 MySQL,默认端口 3306
mysql -u root -p
# 连接指定 IP 和端口
mysql -h 127.0.0.1 -P 3306 -u root -p
易错坑:端口参数是大写 -P,小写 -p 代表密码。
若提示"mysql 不是内部命令",需将 phpStudy 的 mysql/bin 目录加入系统环境变量 PATH。
3.4 连接后高频内置命令
— 查看当前 MySQL 服务器上所有的数据库
SHOW DATABASES;
— 切换到名为 mysql 的数据库
USE mysql;
— 查看当前数据库里所有的表
SHOW TABLES;
— 查看当前正在使用哪个数据库
SELECT DATABASE();
— 退出 MySQL 命令行
EXIT;
3.5 易错点
四、SQL 基础
4.1 SQL 是什么
SQL(Structured Query Language,结构化查询语言)是关系型数据库通用的交互标准,所有数据库交互行为都依靠 SQL。它是人与数据库交互的"通用钥匙"。
网安底层逻辑:所有 SQL 注入漏洞,本质都是可控用户输入拼接篡改了原生 SQL 语句。图形化工具底层执行逻辑仍是 SQL 语句。
4.2 SQL 四大分类
| DDL | 数据定义语言 | CREATE、ALTER、DROP | 操作库表结构,不操作数据 |
| DML | 数据操作语言 | INSERT、UPDATE、DELETE | 操作表内单行数据 |
| DQL | 数据查询语言 | SELECT | 数据筛选读取,注入使用频率最高 |
| DCL | 数据控制语言 | GRANT、REVOKE | 权限管控 |
记忆口诀:DDL 改结构、DML 改数据、DQL 查数据、DCL 控权限。
五、DDL:库表结构操作
5.1 创建数据库与表
— 创建数据库(不存在才创建,指定字符集)
CREATE DATABASE IF NOT EXISTS school CHARACTER SET utf8 COLLATE utf8_general_ci;
— 使用数据库
USE school;
— 创建数据表:主键自增 + 字符串字段
CREATE TABLE students (
student_id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
real_name VARCHAR(50) NOT NULL,
age INT NOT NULL
);
核心知识点:
- PRIMARY KEY(主键):唯一标识行数据,确保无重复且非空
- AUTO_INCREMENT(自增):自动分配唯一数字 ID,无需手动输入
- VARCHAR(50):字符串类型,最多容纳 50 个字符
- NOT NULL:该字段不允许为空
5.2 删除表与数据库
— 删除数据表
DROP TABLE IF EXISTS students;
— 删除数据库
DROP DATABASE IF EXISTS school;
CREATE 用于创建对象,DROP 用于删除对象。这些语句操作的是"数据库对象",不是表中的具体某一行数据。
六、DML:数据增删改
6.1 INSERT 数据新增
— 单条插入:字段顺序、值顺序一一对应
INSERT INTO students(username, real_name, gender, age, phone, class_id)
VALUES('sunqi', '孙七', '男', 20, '13800000005', 2);
— 批量插入
INSERT INTO students(username, real_name, gender, age, phone, class_id)
VALUES
('zhouba', '周八', '女', 19, '13800000006', 1),
('wujiu', '吴九', '男', 22, '13800000007', 3);
注意事项:字段与值的顺序和数量必须一一对应;字符串值需用单引号 ' 包裹,数值则无需。
6.2 UPDATE 数据修改
UPDATE students
SET phone = '13900000001'
WHERE student_id = 1;
重要知识点:UPDATE 必须配合 WHERE 使用;没有 WHERE 会修改整张表的数据,导致严重后果!
6.3 DELETE 数据删除
DELETE FROM students WHERE student_id = 4;
重要知识点:DELETE 也建议始终配合 WHERE;没有 WHERE 会删除整张表的所有记录且不可撤回。
七、DQL:数据查询【重点】
SELECT 是最核心的查询语句,后续大部分信息获取和枚举动作,本质上都依赖查询能力。
7.1 基本查询
— 查询全部字段
SELECT * FROM students;
— 查询指定字段
SELECT username, real_name, phone FROM students;
— 去重查询:过滤重复的班级 ID
SELECT DISTINCT class_id FROM students;
7.2 排序查询
— 按年龄降序排列(DESC 降序,ASC 升序为默认)
SELECT * FROM students ORDER BY age DESC;
7.3 限制数量
— 仅返回前 3 条
SELECT * FROM students LIMIT 0, 3;
— 从第 2 条开始返回 5 条(分页场景:offset, size)
SELECT * FROM students LIMIT 1, 5;
八、UNION 联合查询
UNION 用于把两个或多个 SELECT 查询结果合并到一起。
— 基本语法
SELECT 字段列表 FROM 表1
UNION
SELECT 字段列表 FROM 表2;
示例:合并两个班级的查询结果
SELECT real_name FROM students WHERE class_id = 1
UNION
SELECT real_name FROM students WHERE class_id = 2;
UNION 与 UNION ALL 的区别:
| UNION | 合并结果并自动去重 | 结果唯一,但多一次去重开销 |
| UNION ALL | 合并结果不去重 | 保留全部行,执行效率更高 |
关键使用要求:
九、易错点总结
| 语句结尾漏分号 | 多数 SQL 语句结尾需要加英文 ;,不加会进入多行等待模式 |
| 命令行密码带空格 | mysql -p 后禁止加空格和明文密码,回车后输入无回显 |
| 注释符使用错误 | 单行注释 — 后必须加空格;# 也可作行注释;/* */ 多行注释 |
| 字符串遗漏引号 | 字符串值必须用英文单引号 ' 包裹,忘记闭合会语法错误 |
| UPDATE/DELETE 忘写 WHERE | 忘写 WHERE 会修改或删除整张表,是典型事故点 |
十、知识小结
| 数据库 | 按结构组织、存储、管理数据的集合 | 大型图书馆 |
| DBMS | 创建库表、执行 SQL、控制权限的软件 | 图书管理员 |
| 基础对象 | 表/记录/字段/主键/外键/索引 | 主键定位、外键关联、索引提速 |
| 连接方式 | Navicat 图形化 + mysql 命令行 | 图形化底层也是 SQL |
| SQL 分类 | DDL/DML/DQL/DCL | 改结构/改数据/查数据/控权限 |
| INSERT | 单条/批量插入,值用单引号 | 字段值一一对应 |
| UPDATE | SET + WHERE | 忘写 WHERE 全表被改 |
| DELETE | DELETE FROM + WHERE | 忘写 WHERE 全表被删 |
| SELECT | * / 指定字段 / DISTINCT / ORDER BY / LIMIT | 查询能力是后续基础 |
| UNION | 合并结果集,UNION 去重、UNION ALL 不去重 | 列数必须一致 |
合规声明:本课所有 SQL 操作均在本地 phpStudy 的 MySQL 环境中执行,仅用于学习目的。严禁在未授权的数据库上执行任何 SQL 操作。
从数据库概念到 CRUD 操作,从 SELECT 查询到 UNION 联合查询,MySQL 基础是数据库安全的起点。记住:查询(DQL)能力决定了后续信息获取的能力,权限控制(DCL)决定了账号能做什么,information_schema 是数据库结构枚举的关键入口。下一篇将进入条件 SQL 与 SQL 注入原理——用户的输入为什么会改变 SQL 语句的原意。
网硕互联帮助中心




评论前必须登录!
注册