2026年7月7日
SQL 注入学习笔记
从原理、判断方式和防御思路整理 SQL 注入的入门知识。
SQL 注入是什么
SQL 注入的核心问题是:程序把用户输入直接拼接进 SQL 语句中,导致用户输入被数据库当成 SQL 代码执行。它不是数据库本身的神秘漏洞,而是应用层处理输入时没有做好边界。
一个典型的危险写法是:
SELECT * FROM users WHERE username = '$username' AND password = '$password';
如果 $username 和 $password 直接来自用户输入,攻击者就可能通过构造特殊字符改变原本的查询逻辑。
入门判断思路
刚开始学习时,我会先从这些现象判断是否可能存在注入点:
- 输入单引号后页面报错或返回异常。
- 输入布尔条件后页面内容发生变化。
- 参数看起来会参与数据库查询,比如
id=1。 - 页面返回结果和参数之间存在明显对应关系。
例如在 CTF 题目中,常见测试方式包括:
?id=1'
?id=1 and 1=1
?id=1 and 1=2
如果 1=1 和 1=2 的页面结果不同,就说明参数可能影响了 SQL 查询逻辑。
防御思路
防御 SQL 注入最重要的是不要拼接 SQL。实际开发中应该使用参数化查询或预编译语句,让用户输入只作为数据,而不是 SQL 代码的一部分。
除了参数化查询,还需要:
- 限制数据库账号权限。
- 对输入做合理校验。
- 不把详细数据库错误暴露给前端页面。
- 对关键接口增加日志和监控。
学习感受
SQL 注入入门不难,但真正理解需要多做题、多复盘。每次做完题都应该问自己:注入点在哪里?原 SQL 可能是什么?我构造的 payload 改变了哪一部分逻辑?这样才能从“会套 payload”慢慢变成“理解漏洞”。