网安入门之MySQL后端基础

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云解析 DNS,旗舰版 1个月
简介: 《网安入门之MySQL后端基础》简介:本文介绍了数据库及MySQL的基础知识,涵盖数据库的概念、结构与操作。数据库是组织化存储数据的集合,通过表、列、行等结构实现高效管理。MySQL作为开源的关系型数据库管理系统,广泛应用于Web开发。文中详细讲解了MySQL的基本操作,如增(INSERT)、删(DELETE)、改(UPDATE)、查(SELECT)等语句的使用方法,并介绍了数据库事务的ACID特性。此外,还探讨了SQL注入攻击的风险及防范措施,强调了预处理语句的重要性。最后,简述了PHP中mysqli扩展的使用方法,包括连接数据库、执行查询和关闭连接等步骤。

网安入门之MySQL后端基础
数据库 (Database)
数据库是指长期存储在计算机中的,有组织、可共享的数据集合。它通过表、列、行等结构来组织数据,目的是使数据可以高效存储、检索和管理。数据库通常包括多个表,每个表存储与特定主题或对象相关的数据
数据库管理系统 (DBMS)
数据库管理系统(DBMS)是用于创建、管理、操作、维护数据库的软件。它提供了用户与数据库交互的接口,支持数据的增、删、改、查等操作,并确保数据的完整性、安全性和一致性。常见的DBMS有:

  1. MySQL:开源的关系型数据库管理系统,广泛用于Web开发中
  2. MSSQL:微软推出的关系型数据库管理系统,通常用于企业级应用
  3. ORACLE:强大的关系型数据库系统,广泛应用于大型企业
  4. Redis:一个高性能的键值数据库,通常用于缓存和实时数据处理
  5. Access:微软推出的小型数据库管理系统,适合小型应用
    Excel 与 DBMS
    虽然Excel本身不是一个数据库管理系统,但它可以用作简易数据库来存储和组织数据。Excel通过表格的形式组织数据,可以进行基本的增、删、改、查操作,适合小规模数据管理。不过,Excel的功能有限,不具备DBMS的高效性、并发控制、事务处理等特性。因此,Excel不适合处理大量数据或复杂的数据库操作
    数据库的操作
    数据库通常支持以下基本操作:
  6. 增(INSERT):向数据库表中插入新数据
    o 通过 INSERT 语句可以添加新记录到表中
  7. 删(DELETE):从数据库表中删除数据
    o 使用 DELETE 语句来删除一行或多行数据
  8. 改(UPDATE):更新数据库表中的已有数据
    o 使用 UPDATE 语句来修改表中的记录
  9. 查(SELECT):查询数据库中的数据
    o 使用 SELECT 语句来检索数据,可以进行复杂的过滤、排序、连接等操作
  10. 新建数据库(CREATE DATABASE):创建一个新的数据库
    o 使用 CREATE DATABASE 语句可以新建一个数据库
  11. 新建数据表(CREATE TABLE):在数据库中创建一个新的表
    o CREATE TABLE 语句定义表的结构,包括列名、数据类型、主键等
  12. 新建数据列(ALTER TABLE):向已有的数据表中添加、删除或修改列
    o 使用 ALTER TABLE 可以添加、删除或修改表的字段,允许对表进行扩展或调整
    数据库表的组成
    数据库表是由行(记录)和列(字段)组成的二维结构。每个表有:
  13. 列(Field/Column):每列存储一种类型的数据,如 ID、Name、Age 等
  14. 行(Record/Row):每行表示一条具体的数据记录,每行数据包含所有列的值
    数据库操作示例
  15. 插入数据(INSERT):
    //创建数据表
    CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100),
    age INT
    );
    INSERT INTO users (name, age) VALUES ('Alice', 30);

可见已经插入:

  1. 删除数据(DELETE):
    DELETE FROM users WHERE name = 'Alice'

因为已经删除了,再次查询就没有了

  1. 更新数据(UPDATE):
    UPDATE users SET age = 31 WHERE name = 'Alice'
  1. 查询数据(SELECT):
    SELECT * FROM users WHERE age > 25

数据库事务
DBMS通常支持事务的管理。一个事务是一组操作的集合,它要么完全执行,要么完全不执行。事务保证了数据库的ACID特性(原子性、一致性、隔离性、持久性)

  1. 原子性(Atomicity):事务中的所有操作要么全部执行,要么全部不执行
  2. 一致性(Consistency):事务的执行使得数据库从一个一致性状态转变为另一个一致性状态
  3. 隔离性(Isolation):事务的执行不受其他事务的干扰
  4. 持久性(Durability):事务一旦提交,它的结果就永久保存在数据库中
    总结
    SELECT * FROM userinfo WHERE 1
    查询 想要查询到的结果(数据列的名称) 从哪儿来(从哪个数据表操作) 资源归属(数据表的名称) where 限制条件(key=value)
    INSERT INTO 表名(字段名称1, 字段名称2) VALUES (字段值1,字段值2)

    可以不用对记录中每一个字段都赋值,但是字段名称和字段值数量要一致

    UPDATE 表名 SET 字段 = '值' WHERE 条件
    DELETE FROM 表名 WHERE 条件

    delete没有输入字段,是因为我们是将整条记录一起删除的

  5. AND
    AND 是 SQL 中的逻辑运算符,用于在 WHERE 子句中组合多个条件。只有当所有条件都为 TRUE 时,整个表达式才返回 TRUE。
    用法:当多个条件必须同时满足时,可以使用 AND 连接。例如,查询年龄大于 20 且性别为男性的所有用户:
    SELECT * FROM users WHERE age > 20 AND gender = 'Male';

  6. OR
    OR 也是 SQL 中的逻辑运算符,用于在 WHERE 子句中组合多个条件。只要有一个条件为 TRUE,整个表达式就返回 TRUE。
    用法:当多个条件中至少有一个条件满足时,可以使用 OR 连接。例如,查询年龄大于 20 或性别为男性的所有用户:
    SELECT * FROM users WHERE age > 20 OR gender = 'Male';

  7. ORDER BY(后期用来SQL注入攻击探测列数)
    ORDER BY 用于对查询结果进行排序。你可以指定按一个或多个列进行排序,并选择升序(ASC)或降序(DESC)排列。
    用法:默认是升序排列(ASC),如果需要降序排列,可以明确指定 DESC。例如,按 age 升序排列用户:
    SELECT * FROM users ORDER BY age ASC;

如果要按多个字段排序,可以在 ORDER BY 后列出多个字段,按顺序排列。例如,先按 age 升序排列,再按 name 字母顺序排列:
SELECT * FROM users ORDER BY age ASC, name ASC;

  1. UNION(后期用来联合查询攻击)
    UNION 用于将两个或多个 SELECT 查询的结果合并成一个结果集。注意,UNION 会去除重复的记录。如果需要包含所有记录(包括重复记录),可以使用 UNION ALL。
    用法:UNION:将两个查询的结果合并,并去掉重复的行。UNION ALL:将两个查询的结果合并,包括重复的行。例如,查询 users 表和 employees 表的所有 name 字段,合并结果:
    SELECT name FROM users UNION SELECT name FROM employees;

如果不去掉重复记录,可以使用 UNION ALL:
SELECT name FROM users UNION ALL SELECT name FROM employees;

总结

  1. AND:用来连接多个条件,所有条件都满足时,返回 TRUE。
  2. OR:用来连接多个条件,只要有一个条件满足时,返回 TRUE。
  3. ORDER BY:用来排序查询结果,可以指定排序的列及排序顺序。
  4. UNION:用来合并多个 SELECT 查询的结果,默认去掉重复行,可以使用 UNION ALL 保留重复行
  5. LIKE
    LIKE 是 SQL 中用于模式匹配的运算符,常用于 WHERE 子句中,用来匹配列中的某些字符模式。通常与通配符(如 % 和 )一起使用。
    用法:
    %:表示零个或多个字符。
    :表示一个字符。
    示例:匹配以特定字符开头的值,查询名字以 "A" 开头的所有用户:
    SELECT * FROM users WHERE name LIKE 'A%';

这条查询会返回所有名字以 "A" 开头的用户,例如 "Alice"、"Alex"。

  1. 匹配包含特定字符的值查询名字中包含 "li" 的所有用户:
    SELECT * FROM users WHERE name LIKE '%li%';

这条查询会返回名字中包含 "li" 的所有用户,例如 "Alice"、"Bill"。

  1. 匹配特定字符数的值查询名字的第二个字符是 "l" 的用户:
    SELECT * FROM users WHERE name LIKE '_l%';

这条查询会返回名字第二个字符是 "l" 的用户,例如 "Alice"。

  1. GROUP BY
    GROUP BY 用于将查询结果按某些列进行分组。它通常与聚合函数(如 COUNT、SUM、AVG、MAX、MIN 等)一起使用,用来对每个分组执行聚合操作。
    用法: GROUP BY 将结果集按指定的列进行分组,然后可以对每个分组执行聚合操作。
    示例:按年龄分组并统计每个年龄段的用户数查询每个年龄段的用户数量:
    SELECT age, COUNT(*) AS num_users FROM users GROUP BY age;

这条查询会按 age 列对用户进行分组,并返回每个年龄的用户数量。

  1. 按部门分组并求每个部门的最大工资查询每个部门的最高工资:
    SELECT department, MAX(salary) AS max_salary FROM employees GROUP BY department;

这条查询会返回每个部门中薪资最高的员工工资。

  1. 按多个列分组按年龄和性别分组,并计算每个分组的用户数量:
    SELECT age, gender, COUNT(*) AS num_users FROM users GROUP BY age, gender;

这条查询会返回每个年龄和性别组合下的用户数量。

  1. IN
    IN 是 SQL 中的一种运算符,用于检查某个值是否在指定的一组值中。通常用于 WHERE 子句中,可以简化多个 OR 条件的表达式。
    用法: IN 用于匹配指定列的值是否在给定的集合中。
    示例:查询年龄为 20、25 或 30 的用户使用 IN 来匹配年龄为 20、25 或 30 的用户:
    SELECT * FROM users WHERE age IN (20, 25, 30);

这条查询会返回年龄是 20、25 或 30 的用户。

  1. 查询名字为 "Alice"、"Bob" 或 "Charlie" 的用户使用 IN 来匹配名字为 "Alice"、"Bob" 或 "Charlie" 的用户:
    SELECT * FROM users WHERE name IN ('Alice', 'Bob', 'Charlie');

这条查询会返回名字为 "Alice"、"Bob" 或 "Charlie" 的用户。

  1. 与子查询一起使用使用子查询返回的结果作为 IN 的参数。例如,查询所有在部门 A 或部门 B 的员工:
    SELECT * FROM employees WHERE department IN (SELECT department FROM departments WHERE name IN ('A', 'B'));

这条查询会返回所有在部门 A 或部门 B 的员工。
利用 LIKE 进行 SQL 注入:
LIKE 通常在数据库查询中作为过滤条件使用。如果输入没有正确验证或过滤,攻击者可能会通过构造恶意输入,导致 SQL 注入。
例如,如果网站允许用户通过查询名字来查找用户,但没有正确处理输入,攻击者可能会尝试通过 LIKE 运算符注入 SQL 代码。
示例注入攻击: 假设查询语句为:
SELECT * FROM users WHERE name LIKE '%[用户输入]%';

攻击者可以输入如下内容:
' OR '1'='1

这会导致 SQL 查询变成:
SELECT * FROM users WHERE name LIKE '% OR '1'='1%';

这样,OR '1'='1' 总是为真,导致返回所有记录,从而绕过认证或过滤。
利用 GROUP BY 进行 SQL 注入:
攻击者可能利用 GROUP BY 子句注入恶意 SQL 代码。假设应用程序没有正确处理用户输入,攻击者可以插入恶意的 GROUP BY 子句,尝试影响查询结果或利用数据库的结构信息。
示例注入攻击: 假设查询语句是:
SELECT department, COUNT(*) FROM employees GROUP BY department;

攻击者输入恶意代码:
' GROUP BY CONCAT(username, password) --

这可能导致查询变成:
SELECT department, COUNT(*) FROM employees GROUP BY CONCAT(username, password) -- ;

CONCAT(username, password) 会拼接 username 和 password 列的值,并可能返回这些敏感信息。
利用 IN 进行 SQL 注入:
攻击者可能在 IN 子句中注入恶意值,导致 SQL 查询失效或获取不必要的数据。注入攻击通常利用 IN 语句的数组特性来篡改查询。
示例注入攻击: 假设查询语句是:
SELECT * FROM users WHERE name IN ('[用户输入]');

攻击者输入恶意内容:
' OR '1'='1' --

这会导致查询变成:
SELECT * FROM users WHERE name IN ('', ' OR '1'='1' --');

由于 1 = 1 始终为真,查询可能返回所有记录,绕过身份验证或其他限制。
在 PHP 中,可以使用 mysqli 扩展来与 MySQL 数据库进行交互。mysqli(MySQL Improved)提供了一个更为现代化和灵活的方式来操作 MySQL 数据库,支持面向过程和面向对象的编程方式。

  1. 连接 MySQL 数据库
    在执行任何操作之前,首先需要建立与 MySQL 数据库的连接。使用 mysqli_connect 或 new mysqli 方法。
    面向过程:
    $conn = mysqli_connect("localhost", "username", "password", "database_name");
    if (!$conn) {
    die("连接失败: " . mysqli_connect_error());
    }

面向对象:
$conn = new mysqli("localhost", "username", "password", "database_name");
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}

  1. 增、删、改(INSERT、UPDATE、DELETE)
    在执行增、删、改操作时,使用 mysqli_query 函数。mysqli_query 返回一个布尔值(TRUE 或 FALSE),表示查询是否成功执行。
    插入数据(INSERT):
    $sql = "INSERT INTO users (name, age) VALUES ('Alice', 30)";
    if (mysqli_query($conn, $sql)) {
    echo "新记录插入成功";
    } else {
    echo "错误: " . $sql . "
    " . mysqli_error($conn);
    }

更新数据(UPDATE):
$sql = "UPDATE users SET age = 31 WHERE name = 'Alice'";
if (mysqli_query($conn, $sql)) {
echo "记录更新成功";
} else {
echo "错误: " . $sql . "
" . mysqli_error($conn);
}

删除数据(DELETE):
$sql = "DELETE FROM users WHERE name = 'Alice'";
if (mysqli_query($conn, $sql)) {
echo "记录删除成功";
} else {
echo "错误: " . $sql . "
" . mysqli_error($conn);
}

面向对象的语法:
$sql = "INSERT INTO users (name, age) VALUES ('Bob', 25)";
if ($conn->query($sql) === TRUE) {
echo "新记录插入成功";
} else {
echo "错误: " . $sql . "
" . $conn->error;
}

  1. 查询操作(SELECT)
    当执行查询操作(SELECT)时,mysqli_query 返回一个结果集。如果查询成功且有结果,它返回一个 mysqli_result 对象。你需要使用 mysqli_fetch_assoc 或 mysqli_fetch_row 来解析查询结果。
    查询数据(SELECT):
    $sql = "SELECT id, name, age FROM users";
    $result = mysqli_query($conn, $sql);

if (mysqli_num_rows($result) > 0) {
// 输出每行数据
while($row = mysqli_fetch_assoc($result)) {
echo "id: " . $row["id"] . " - Name: " . $row["name"] . " - Age: " . $row["age"] . "
";
}
} else {
echo "没有结果";
}

面向对象的语法:
$sql = "SELECT id, name, age FROM users";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
while ($row = $result->fetch_assoc()) {
echo "id: " . $row["id"] . " - Name: " . $row["name"] . " - Age: " . $row["age"] . "
";
}
} else {
echo "没有结果";
}

  1. mysqli_fetch_assoc 和 mysqli_fetch_row 解析查询结果
    在查询数据时,你可以使用两种常用的函数来解析结果集:
    mysqli_fetch_assoc:返回一个关联数组,其中数组的键是列名(字段名)。这种方法通常用于需要字段名的情况。
    mysqli_fetch_row:返回一个索引数组,其中数组的键是列的数字索引。适用于你只关心结果的顺序,而不关心字段名称的情况。
    使用 mysqli_fetch_assoc:
    $row = mysqli_fetch_assoc($result);
    echo "id: " . $row["id"] . " - Name: " . $row["name"] . " - Age: " . $row["age"] . "
    ";

使用 mysqli_fetch_row:
$row = mysqli_fetch_row($result);
echo "id: " . $row[0] . " - Name: " . $row[1] . " - Age: " . $row[2] . "
";

mysqli_fetch_assoc 返回的结果是一个关联数组,可以通过字段名直接访问数据。而 mysqli_fetch_row 返回的是一个索引数组,字段值是通过列索引来访问的(从 0 开始)。

  1. 关闭连接
    操作完成后,别忘了关闭数据库连接。
    面向过程:
    mysqli_close($conn);

面向对象:
$conn->close();

总结:
增、删、改:使用 mysqli_query 执行操作,返回一个布尔值来判断是否成功。
查询:使用 mysqli_query 执行 SELECT 查询,返回一个结果集,使用 mysqli_fetch_assoc 或 mysqli_fetchrow 解析结果。
面向对象和过程化:可以选择面向过程(mysqli
*)或面向对象($conn->method)的方式来操作 MySQL。
注意: 在使用 mysqli_query 执行用户输入的 SQL 语句时,务必防止 SQL 注入攻击,推荐使用 预处理语句(Prepared Statements) 来确保安全。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4月前
|
安全 关系型数据库 MySQL
PHP与MySQL交互:从入门到实践
【9月更文挑战第20天】在数字时代的浪潮中,掌握PHP与MySQL的互动成为了开发动态网站和应用程序的关键。本文将通过简明的语言和实例,引导你理解PHP如何与MySQL数据库进行对话,开启你的编程之旅。我们将从连接数据库开始,逐步深入到执行查询、处理结果,以及应对常见的挑战。无论你是初学者还是希望提升技能的开发者,这篇文章都将为你提供实用的知识和技巧。让我们一起探索PHP与MySQL交互的世界,解锁数据的力量!
|
5天前
|
存储 缓存 安全
网安入门之PHP后端基础
PHP 是一种服务器端脚本语言,广泛用于动态网站和Web应用程序开发。其文件扩展名为`.php`,支持嵌入HTML、CSS和JavaScript。PHP代码由Web服务器解析后返回给浏览器。PHP是弱类型语言,变量以`$`开头,支持字符串、整数、浮点数、布尔值、数组、对象等类型。PHP具有跨平台、开源、丰富的扩展库等特点。常用超全局变量如`$_GET`、`$_POST`、`$_SESSION`等处理用户输入和会话数据。HTTP请求方法GET和POST在数据传输方式、长度限制、安全性等方面有显著差异。
网安入门之PHP后端基础
|
4月前
|
关系型数据库 MySQL 数据库
MySQL基本操作入门指南
MySQL基本操作入门指南
141 0
|
3月前
|
缓存 架构师 数据库
后端开发的艺术:从入门到精通的旅程####
本文旨在探索后端开发的本质与魅力,通过一段段深入浅出的故事,串联起后端技术的精髓。不同于传统的技术总结,这里我们将以一位普通开发者的成长轨迹为线索,展现从初识编程到成为后端架构师的心路历程。每个阶段都伴随着挑战、学习与突破,最终揭示了技术背后的人文关怀与创新精神。 ####
|
2月前
|
监控 API 持续交付
后端开发中的微服务架构:从入门到精通
【10月更文挑战第26天】 在当今的软件开发领域,微服务架构已经成为了众多企业和开发者的首选。本文将深入探讨微服务架构的核心概念、优势以及实施过程中可能遇到的挑战。我们将从基础开始,逐步深入了解如何构建、部署和管理微服务。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和实用的建议。
50 0
|
3月前
|
JavaScript 前端开发
vue3教程,如何手动获取后端数据(入门到精通3,新人必学篇)
本文提供了一个Vue 3教程,讲解了如何使用axios库手动从后端获取数据,包括安装axios、配置后端访问地址、编写路由地址、发起HTTP请求以及在组件中读取和打印响应数据的步骤。
542 0
vue3教程,如何手动获取后端数据(入门到精通3,新人必学篇)
|
4月前
|
SQL JSON Java
springboot 如何编写增删改查后端接口,小白极速入门,附完整代码
本文为Spring Boot增删改查接口的小白入门教程,介绍了项目的构建、配置YML文件、代码编写(包括实体类、Mapper接口、Mapper.xml、Service和Controller)以及使用Postman进行接口测试的方法。同时提供了SQL代码和完整代码的下载链接。
springboot 如何编写增删改查后端接口,小白极速入门,附完整代码
|
4月前
|
前端开发 JavaScript Java
编程入门之前端和后端开发
前端开发就是开发网页上的内容展示与用户的交互,一部分后端开发工作就是开发数据访问服务,使前端可以通过后端服务对数据进行增删改查,也就是Crud,对前端用户的请求进行相应。
78 8
|
3月前
|
Web App开发 JSON JavaScript
深入浅出:Node.js后端开发入门与实践
【10月更文挑战第4天】在这个数字信息爆炸的时代,了解如何构建一个高效、稳定的后端系统对于开发者来说至关重要。本文将引导你步入Node.js的世界,通过浅显易懂的语言和逐步深入的内容组织,让你不仅理解Node.js的基本概念,还能掌握如何使用它来构建一个简单的后端服务。从安装Node.js到实现一个“Hello World”程序,再到处理HTTP请求,文章将带你一步步走进Node.js的大门。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开一扇通往后端开发新世界的大门。
|
5月前
|
Java 数据库连接 Spring
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
文章是关于Spring、SpringMVC、Mybatis三个后端框架的超详细入门教程,包括基础知识讲解、代码案例及SSM框架整合的实战应用,旨在帮助读者全面理解并掌握这些框架的使用。
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】

推荐镜像

更多