【Web第三周】『12.9-12.14』
- 初步了解数据库(MySQL)
- 初步了解sql注入漏洞
- 练习sql语句
- 搭建sql靶场
初步了解数据库(MySQL)
一、MySQL 基础认知
1. 什么是 MySQL?
一款开源的关系型数据库管理系统(RDBMS),基于客户端 - 服务器架构
核心特点:轻量、高效、跨平台、支持多用户并发访问
应用场景:网站后台数据存储(如电商订单、用户信息)、小型应用数据管理等
2. 核心概念
| 术语 | 解释 | 示例 |
| 数据库(DB) | 存储数据的容器,逻辑上独立的数据集 | school_db(学校数据库) |
| 表(Table) | 数据库中数据的结构化存储单元,按行和列组织 | student(学生表) |
| 行(Row) | 表中的一条具体数据记录 | 一条学生信息(ID、姓名等) |
| 列(Column) | 表中的一个字段,定义数据类型 | name(姓名列,字符串类型) |
| 主键(PK) | 唯一标识表中每行数据的列,不可重复 | student_id(学生 ID) |
| SQL | 操作数据库的标准语言(结构化查询语言) | SELECT * FROM student |
二、MySQL 环境搭建(简版)
1. 安装步骤
下载:官网(MySQL Downloads)选择对应系统版本(Windows/Mac/Linux)
安装:
Windows:双击安装包,选择「Typical」模式,一路下一步(记住 root 密码)
Mac:使用 dmg 镜像安装,或通过 Homebrew 命令 brew install mysql
- 验证:打开终端 / 命令行,输入 mysql -u root -p,输入密码登录成功则安装完成
2. 常用工具
命令行客户端:MySQL 自带,适合快速操作
图形化工具:Navicat、SQLyog、MySQL Workbench(免费),适合可视化管理数据库
三、核心 SQL 操作(CRUD)
1. 数据库操作
-- 1. 创建数据库(指定字符集utf8mb4,支持emoji)CREATE DATABASE school_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;-- 2. 查看所有数据库SHOW DATABASES;-- 3. 使用数据库(切换到目标库)USE school_db;-- 4. 删除数据库(谨慎!不可逆)DROP DATABASE school_db;2. 表操作(创建 / 查看 / 修改 / 删除)
-- 1. 创建表(学生表示例)CREATE TABLE student ( student_id INT PRIMARY KEY AUTO_INCREMENT, -- 主键,自增 name VARCHAR(50) NOT NULL, -- 姓名,非空 age INT DEFAULT 0, -- 年龄,默认值0 gender ENUM('男','女','未知') DEFAULT '未知', -- 性别,枚举类型 create_time DATETIME DEFAULT CURRENT_TIMESTAMP -- 创建时间,默认当前时间);-- 2. 查看表结构DESCRIBE student; -- 或 DESC student;-- 3. 查看所有表SHOW TABLES;-- 4. 修改表(添加列)ALTER TABLE student ADD COLUMN phone VARCHAR(20);-- 5. 删除表(谨慎!)DROP TABLE student;3. 数据操作(增删改查)
(1)新增数据(INSERT)
-- 方式1:指定列插入INSERT INTO student (name, age, gender) VALUES ('张三', 18, '男');-- 方式2:插入多条数据INSERT INTO student (name, age, gender) VALUES ('李四', 19, '女'), ('王五', 20, '男');-- 方式3:全列插入(需按表结构顺序)INSERT INTO student VALUES (NULL, '赵六', 21, '未知', DEFAULT); -- 主键自增填NULL(2)查询数据(SELECT)
-- 1. 查询所有数据SELECT * FROM student;-- 2. 查询指定列SELECT name, age, gender FROM student;-- 3. 条件查询(WHERE子句)SELECT * FROM student WHERE age > 18; -- 年龄大于18SELECT * FROM student WHERE gender = '女' AND age 女且年龄≤20-- 4. 排序查询(ORDER BY,ASC升序/Desc降序)SELECT * FROM student ORDER BY age DESC; -- 按年龄降序-- 5. 限制查询条数(LIMIT)SELECT * FROM student LIMIT 2; -- 只查前2条-- 6. 模糊查询(LIKE)SELECT * FROM student WHERE name LIKE '张%'; -- 姓名以“张”开头(3)修改数据(UPDATE)
-- 修改指定数据(必须加WHERE,否则全表修改!)UPDATE student SET age = 19, phone = '13800138000' WHERE name = '张三';(4)删除数据(DELETE)
-- 删除指定数据(加WHERE条件)DELETE FROM student WHERE student_id = 3;-- 删除全表数据(保留表结构,自增主键不重置)DELETE FROM student;-- 快速删除全表(清空数据+重置自增主键,效率更高)TRUNCATE TABLE student;四、常用进阶技巧
1. 数据类型选型(避免浪费空间)
| 数据类型 | 用途 | 推荐场景 |
| INT | 整数(-21 亿~21 亿) | 年龄、ID、数量 |
| VARCHAR(n) | 可变长度字符串 | 姓名、手机号、地址 |
| DATETIME | 日期时间(格式:YYYY-MM-DD HH:MM:SS) | 创建时间、更新时间 |
| ENUM | 固定枚举值 | 性别、状态(如 “启用 / 禁用”) |
2. 注意事项
关键字不做表名 / 列名(如SELECT、TABLE、USER等)
字符串和日期类型需用单引号包裹(如’张三’、‘2024-01-01’)
操作前先备份数据,DROP/DELETE无 WHERE 条件需格外谨慎
中文乱码解决方案:创建数据库 / 表时指定utf8mb4字符集
初步了解sql注入漏洞
一、什么是 SQL 注入?
1. 核心定义
SQL 注入(SQL Injection,简称 SQLi)是最常见的 Web 安全漏洞之一,本质是:攻击者通过输入恶意 SQL 语句,欺骗应用程序执行非预期的数据库操作。
核心原因:应用程序未对用户输入进行严格过滤 / 转义,直接将用户输入拼接到 SQL 语句中执行。
2. 类比理解
比如之前 MySQL 笔记中的条件查询:
-- 正常逻辑:根据用户输入的用户名查询SELECT * FROM users WHERE username = '$user_input';若用户输入恶意内容 ’ OR ‘1’='1,拼接后 SQL 变成:
SELECT * FROM users WHERE username = '' OR '1'='1';由于 ‘1’='1 恒为真,将返回全表用户数据,造成信息泄露。
二、SQL 注入的核心原理
1. 漏洞产生的 3 个必要条件
用户可控输入:攻击者能修改输入内容(如登录框、搜索框、URL 参数等);
输入直接拼接 SQL:应用程序未处理用户输入,直接嵌入 SQL 语句;
SQL 语句被执行:拼接后的恶意 SQL 语句被数据库执行,产生危害。
2. 简单注入流程示意图
用户输入 → 未过滤处理 → 拼接 SQL 语句 → 数据库执行 → 返回恶意结果(恶意内容) (如 ' OR 1=1--)三、SQL 注入的常见类型(按注入方式)
1. 联合查询注入(UNION 注入)
利用 UNION 关键字拼接查询语句,获取其他表的数据;
适用场景:目标 SQL 语句返回结果集(如搜索、列表查询)。
示例:
-- 正常查询:搜索文章SELECT title, content FROM articles WHERE keyword = '$input';-- 恶意输入:' UNION SELECT username, password FROM users---- 拼接后执行:SELECT title, content FROM articles WHERE keyword = '' UNION SELECT username, password FROM users--';(-- 是 SQL 注释符,用于忽略后面的语句)
2. 布尔盲注(Boolean Blind)
攻击者通过输入判断条件(如 OR 1=1、OR 1=2),根据应用程序的返回结果(成功 / 失败、显示 / 不显示)推测数据库信息;
适用场景:目标 SQL 语句不返回结果集,但会根据条件返回不同页面。
3. 时间盲注(Time Blind)
利用 SLEEP() 等函数,通过观察页面响应时间判断条件是否成立;
适用场景:应用程序对真假条件返回相同页面,无明显差异。
示例:
-- 恶意输入:' OR SLEEP(5)---- 若条件成立,数据库会延迟 5 秒响应,以此确认注入点存在4. 报错注入
构造恶意输入触发数据库报错,从错误信息中提取数据库结构(如表名、列名);
依赖:应用程序开启了错误显示(生产环境应关闭)。
四、SQL 注入的危害(从轻度到严重)
信息泄露:获取数据库中的用户信息(账号密码、手机号)、业务数据(订单、支付记录);
数据篡改:修改数据库内容(如修改密码、篡改订单金额);
数据删除:通过 DROP TABLE、DELETE 语句删除表或数据(不可逆);
权限提升:获取数据库管理员(root)权限,甚至控制整个服务器。
五、基础防护措施(核心原则:过滤输入 + 避免拼接)
1. 核心防护:使用参数化查询(PreparedStatement)
原理:将 SQL 语句与用户输入分离,用户输入仅作为 “参数值” 传递,而非 SQL 语句的一部分;
示例(Java 伪代码):
// 错误方式:直接拼接String sql = "SELECT * FROM users WHERE username = '" + userInput + "'";// 正确方式:参数化查询String sql = "SELECT * FROM users WHERE username = ?"; // ? 为占位符PreparedStatement pstmt = conn.prepareStatement(sql);pstmt.setString(1, userInput); // 自动过滤转义,安全!- 注意:所有开发语言(PHP、Python、Java)均支持参数化查询,这是最有效的防护手段。
2. 输入过滤与转义
对用户输入的特殊字符(如 '、"、;、–)进行转义处理;
示例:将单引号 ’ 转义为 ‘’(MySQL 中两个单引号表示普通字符);
局限:仅作为辅助防护,不能替代参数化查询(复杂场景易被绕过)。
3. 限制数据库权限
应用程序连接数据库时,使用最小权限账号(而非 root);
例如:查询操作仅授予 SELECT 权限,禁止 DROP、ALTER 等高危操作。
4. 关闭错误显示
生产环境中,禁用应用程序的 SQL 错误详情显示(避免攻击者通过错误信息推测数据库结构);
替换为自定义错误页面(如 “系统繁忙,请稍后再试”)。
5. 避免使用动态 SQL
- 尽量减少拼接 SQL 语句,尤其避免根据用户输入动态生成表名、列名(如无必要,不使用 SELECT $column FROM $table 这类写法)。
练习sql语句
[!note] 笔记
- 下载navicat
- 右键点击安装程序文件 “navicat16.3.5_premium_cs_x64.exe”,选择 “以管理员身份运行”
- 等待出现安装程序欢迎界面,“欢迎安装 Navicat Premium 16”,点击 “下一步”
- 一直继续,直至勾选 “Create a desktop icon”(创建桌面图标),然后点击 “下一步
- 安装完成,出现 “完成 Navicat Premium 16 安装向导” 界面,点击 “完成” 即可。注意此时不要着急启动 Navicat Premium 16。
- 找到下载的 “Navicat16.2-16.3bd.zip” 压缩包,右键点击,选择解压到
- 双击解压文件中的【无限…】
- 打开 Navicat Premium 16 的安装目录
- 将补丁文件中的 “winmm.dll” 拖动或者复制到 Navicat Premium 16 的安装目录中,替换原文件,如出现需要确认文件替换操作,点击确认 。
- 进入 Navicat Premium 16 主界面,显示版本为 16.3.5 。
- 点击 “连接” 按钮,可选择多种数据库类型,如 MySQL、PostgreSQL 等多种数据库 。
- 点击 “MySQL” 后,弹出 “新建连接 (MySQL)” 窗口,输入连接名、主机、端口、用户名和密码等信息,点击 “确认” 连接数据库
- 打开小皮,将下方语句一一执行
- 完成