05 SQL 注入的原理是什么?怎么测试?怎么防御?
2026/9/17...大约 2 分钟
05|SQL 注入的原理是什么?怎么测试?怎么防御?
开场原理一句话讲透:用户输入被拼接到 SQL 语句里当代码执行了——输入
' or '1'='1让本来where name='xxx'的条件恒真。
回答思路
第一步:原理加演化路径
输入 ' or '1'='1 让条件恒真,攻击者拿到本不该返回的数据——更进一步可以 union 查别的表、甚至执行系统命令。原理加演化路径一起讲,显功力。
第二步:测试方法分步
| 手法 | 做法 |
|---|---|
| 报错试探 | 输入单引号看报错——数据库报错信息直接回显是双重漏洞 |
| 布尔盲注 | 恒真恒假语句对比返回差异 |
| 时间盲注 | 用延时语句 sleep 看响应时间 |
| 工具实证 | sqlmap 跑参数(报出数据库类型、跑出数据就是实锤) |
手工发现加工具实证的组合最专业。
第三步:讲测试的度(职业素养)
测试环境可以实际拖数据证明危害;生产或共享环境只做无害验证(报错和布尔差异就够证明)——拿数据要授权。
第四步:防御手段分层
- 根本解:参数化查询(预编译——输入永远当数据,不当代码)
- 辅助层:输入校验(白名单)、最小权限(应用账号不给删库权限)、报错信息不回显、WAF 挡已知攻击特征
层层设防,不是单点依赖。
收尾:讲测试视角的验证
修复后回归不只看功能正常——拿原来的注入 payload 重放确认被参数化挡住,并把 payload 沉淀进安全用例库防复发。
考察重点
| 维度 | 说明 |
|---|---|
| 企业动机 | 安全面试的第一必考题(牛客、JavaGuide、面试鸭全部收录)——危害大(拖库)且防御方案成熟,考全链路理解最高效 |
| 过线标准 | 原理清楚 + 至少说出盲注一种 + 参数化是根本解 |
| 区分度 | 报错、布尔、时间三种注入手法都会讲的是真试过的;只会一个 payload 的是背的 |
| 加分项 | 测试的度(无害验证意识)、最小权限的纵深防御 |
| 减分项 | 防御只说「过滤特殊字符」——黑名单天然防不住(编码绕过),暴露不懂根本解 |
来源
整理自知识星球帖《面试情报 05|安全测试 20 题》,返回题库。