Chloe's archive
← Back to blog

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=11=2 的页面结果不同,就说明参数可能影响了 SQL 查询逻辑。

防御思路

防御 SQL 注入最重要的是不要拼接 SQL。实际开发中应该使用参数化查询或预编译语句,让用户输入只作为数据,而不是 SQL 代码的一部分。

除了参数化查询,还需要:

  1. 限制数据库账号权限。
  2. 对输入做合理校验。
  3. 不把详细数据库错误暴露给前端页面。
  4. 对关键接口增加日志和监控。

学习感受

SQL 注入入门不难,但真正理解需要多做题、多复盘。每次做完题都应该问自己:注入点在哪里?原 SQL 可能是什么?我构造的 payload 改变了哪一部分逻辑?这样才能从“会套 payload”慢慢变成“理解漏洞”。