什么是 SQL 注入

SQL 注入就是把恶意的 SQL 命令插入到网站的输入框(账号/密码/搜索等),让服务器执行这些恶意命令,从而获取甚至篡改数据库里的敏感数据。

注入分类

1. 按查询字段类型分

类型 定义 特点
字符型注入 输入的参数是字符串(带引号) 必须用引号闭合,如 ' or 1=1#
数字型注入 输入的参数是整数(无引号) 直接拼接 SQL,如 id=1 and 1=1

2. 按注入方法分(核心 4 种)

方法 核心逻辑 特点
Union 注入 利用 UNION 合并多条查询结果 能直接把数据查出来,最常用
报错注入 故意让 SQL 报错,把数据显示在错误信息里 不用回显位,靠报错拿数据
布尔注入 靠页面是否显示成功/失败来猜数据 页面只回显”成功/失败”,慢慢猜
时间注入 靠页面响应时间来推断数据 无回显时用,靠 sleep(5) 等函数

注入点

什么是注入点

用户输入能直接拼接到后台 SQL 语句并被数据库执行的入口。本质上就是人机交互的地方

常见注入点位置

位置 示例
GET 请求参数 URL 中 ?id=1?name=test
POST 请求参数 登录框、搜索框、表单提交
HTTP 请求头 Cookie、User-Agent、Referer

判断注入点的方法

  • 数字型id=1 AND 1=1 正常,id=1 AND 1=2 异常
  • 字符型:输入 ' 页面报错 → 存在字符型注入

闭合方式

类型 原始拼接方式 是否需要闭合符 注入输入示例
字符型 id='$id' 1' and 1=1--+
数字型 id=$id 1 and 1=2

常见闭合符号

' " ') '')

判断闭合三步骤

第一步:测试单引号 '

  • 提交 ?id=1'
  • 报错 → 单引号闭合 ✓
  • 正常 → 继续下一步

第二步:测试双引号 "

  • 提交 ?id=1"
  • 报错 → 双引号闭合 ✓
  • 正常 → 大概率是数字型

第三步:验证数字型

  • 提交 ?id=1 and 1=2
  • 页面无数据/异常 → 数字型
  • 正常 → 考虑括号等特殊闭合

常用注释符

符号 说明
--+ 最常用,适配 URL 传参
# MySQL 原生注释
%23 # 的 URL 编码形式

防护核心

  1. 对所有用户输入做严格过滤
  2. 使用预编译语句(Prepared Statement)
  3. 避免直接拼接 SQL