SQL注入入门笔记

First Post:

Last Update:

什么是 SQL 注入

SQL 注入(SQL Injection)是一种代码注入技术,攻击者通过在应用程序的输入字段中插入恶意的 SQL 语句,从而操纵后端数据库执行非预期的操作。

原理简介

当 Web 应用程序将用户输入直接拼接到 SQL 查询语句中,而没有进行适当的过滤或参数化处理时,就可能产生 SQL 注入漏洞。

漏洞代码示例

1
2
3
4
// 危险写法 - 直接拼接用户输入
$id = $_GET['id'];
$query = "SELECT * FROM users WHERE id = $id";
$result = mysqli_query($conn, $query);

攻击示例

假设正常查询为:

1
SELECT * FROM users WHERE id = 1;

攻击者输入 1 OR 1=1,查询变成:

1
SELECT * FROM users WHERE id = 1 OR 1=1;

由于 1=1 永远为真,这条语句会返回 users 表中的所有数据。

SQL 注入分类

类型 说明
数字型注入 参数未用引号包裹,如 id=1
字符型注入 参数用引号包裹,如 name='admin'
联合查询注入 使用 UNION SELECT 获取其他表数据
报错注入 利用数据库报错信息获取数据
布尔盲注 根据页面返回的 True/False 状态判断
时间盲注 利用 SLEEP() 等函数的时间延迟判断

防御方法

1. 使用参数化查询(推荐)

1
2
3
4
// 安全的参数化查询
$stmt = $conn->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param("i", $id);
$stmt->execute();

2. 输入验证与过滤

  • 对用户输入进行严格的类型检查
  • 使用白名单验证
  • 转义特殊字符

3. 最小权限原则

  • 数据库账户只授予必要的权限
  • 避免使用 rootsa 等高权限账户连接数据库

推荐学习资源

  • OWASP SQL Injection
  • PortSwigger Web Security Academy - SQL Injection Labs
  • DVWA / sqli-labs 靶场练习

免责声明:本文仅用于学习交流,请勿将文中技术用于非法用途。