SQL注入漏洞学习笔记

SQL注入漏洞学习笔记(第一部分:数据库基础)


1. 数据库基础

1.1 什么是数据库?

  • 定义:数据库是一个电子仓库,用于存储和管理数据。用户可以对数据进行新增、查询、更新、删除等操作。
  • 示例:通讯录是一个简单的数据库,存储姓名和电话号码。

1.2 查询语句(SELECT)
功能:从数据库中检索数据。
示例与原理

SELECT * FROM users;  
  • * 表示所有列。
  • 执行后返回 users 表中所有用户的信息。
SELECT name, email FROM users WHERE gender = 'male';  
  • 仅返回 nameemail 列,且筛选条件为 gender = 'male'
SELECT COUNT(*) FROM users;  
  • COUNT(*) 统计表中的总行数。

1.3 UNION 查询
功能:合并多个 SELECT 的结果集,并自动去重。
语法规则

  • 每个 SELECT 的列数必须相同。
  • 列的数据类型必须兼容。

示例

SELECT name FROM students UNION SELECT name FROM teachers;  
  • 合并 studentsteachers 表的 name 列,并去重。

UNION vs UNION ALL

  • UNION 去重,UNION ALL 保留所有记录(效率更高)。

1.4 information_schema 数据库
功能:存储数据库的元数据(如库名、表名、列名等)。
核心表

  • schemata:存储所有数据库名(schema_name)。
  • tables:存储所有表信息(table_schema 表所属数据库,table_name 表名)。
  • columns:存储所有列信息(column_name 列名)。

示例

SELECT table_name FROM information_schema.tables WHERE table_schema = 'test_db';  
  • 查询 test_db 数据库中的所有表名。

1.5 SQL 高级操作
1.5.1 排序(ORDER BY)

SELECT * FROM users ORDER BY name ASC;  
  • ASC 表示升序,DESC 表示降序。

利用 ORDER BY 判断列数(SQL注入关键步骤):

SELECT user, password FROM users ORDER BY 2;  
  • 按第2列(password)排序。若改为 ORDER BY 3 报错,则说明表中只有2列。

1.5.2 限定行数(LIMIT)

SELECT * FROM users LIMIT 2;  
  • 返回前2行数据。
SELECT user, password FROM users LIMIT 0,1;  
  • 从第0行开始,返回1行数据(常用于分页)。

1.6 字符连接函数

  • CONCAT(str1, str2, …):无分隔符连接。

    SELECT CONCAT(user_id, username) FROM users;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

栀寒老醑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值