SQL 注入:原理与成因
了解经典 SQL 注入、盲注和带外注入,以及参数化查询为何可以防止这些攻击
SQL 注入:原理与成因 是 CoddyKit 上的免费 Cyber Security Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Cyber Security Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Cyber Security Academy 课程共包含 4 节课。
什么是 SQL 注入?
SQL 注入发生在未对用户提供的输入进行适当清理,就将其包含在 SQL 查询中时,从而允许攻击者操纵查询逻辑。这是历史最悠久、危害最大的 Web 漏洞之一。
SQL 注入的工作原理
登录表单会执行查询:SELECT * FROM users WHERE username='INPUT' AND password='INPUT'
如果攻击者在用户名中输入 ' OR 1=1--,查询就会变成:SELECT * FROM users WHERE username='' OR 1=1--' AND password='...' ——这会返回所有用户。
SQL 注入的类型
SQL 注入的变体包括:
- 带内注入:结果直接在响应中返回(经典注入、基于错误的注入)
- 布尔盲注:没有直接输出;根据真/假响应推断数据
- 基于时间的盲注:根据响应延迟推断数据(
SLEEP(5)) - 带外注入:通过 DNS/HTTP 请求窃取数据
基于 UNION 的注入
UNION 攻击会追加攻击者控制的查询所返回的结果:
-- Discover number of columns:
id=1 ORDER BY 3--
-- Extract data:
id=1 UNION SELECT username,password,NULL FROM users--基于错误的注入
错误消息会泄露数据库结构。攻击者输入会导致语法错误的数据,随后产生的错误消息会泄露表名、列名或数据库版本。请在生产环境中禁用详细错误消息。
盲注 SQL 注入
当没有可见输出时,攻击者会使用布尔条件:
-- If admin exists, page loads normally:
id=1 AND (SELECT COUNT(*) FROM users WHERE username='admin')=1--
-- Time-based:
id=1; IF(1=1) WAITFOR DELAY '0:0:5'--sqlmap:自动化 SQL 注入
sqlmap 可以自动执行 SQL 注入检测和利用。如果数据库用户拥有足够权限,它可以导出数据库、读取文件,甚至执行 OS 命令。
sqlmap -u "http://target.com/page?id=1" --dbs
sqlmap -u "http://target.com/page?id=1" -D webapp -T users --dump防止 SQL 注入:参数化查询
主要防御措施是参数化查询(预处理语句)。用户输入会作为参数传入,而不会拼接到查询字符串中:
# Python (safe):
cursor.execute("SELECT * FROM users WHERE username = %s", (username,))
# Node.js (safe):
pool.query("SELECT * FROM users WHERE id = $1", [userId])ORM 防护
使用 ORM(SQLAlchemy、Hibernate、Sequelize)通常可以防止 SQL 注入,因为查询是通过安全抽象构建的。但是,使用字符串插值的原始查询方法(execute()、query())会绕过 ORM 的防护。
输入验证与 WAF
其他防御措施包括:
- 验证输入类型并使用允许列表(整数、电子邮件地址)
- 使用 Web 应用防火墙(WAF)检测注入模式
- 使用最小权限的数据库账户(只读查询中不授予 DROP 和 UNION 权限)
- 使用存储过程(可减少暴露面,但不是完整解决方案)
SQL 注入的影响
成功的 SQL 注入可能导致:完整导出数据库、绕过身份验证、修改或删除数据、读取服务器文件(LOAD_FILE)、写入 WebShell,以及通过 xp_cmdshell(MSSQL)执行 OS 命令。
快速检查:SQL 注入
防御 SQL 注入的主要措施是什么?
课程回顾
SQL 注入会通过未经清理的用户输入操纵数据库查询。攻击类型包括经典型、盲注布尔型、基于时间型和基于 UNION 型。主要防御措施是使用参数化查询——绝不要将用户输入拼接到 SQL 中。请谨慎使用对象关系映射工具,为数据库账户应用最小权限原则,并禁用详细错误消息。
常见问题解答
「SQL 注入:原理与成因」课时是免费的吗?
是的 — 「SQL 注入:原理与成因」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Cyber Security Academy 课程的其余内容,请升级到 CoddyKit PRO。 Cyber Security Academy 课程共包含 4 节课。
「SQL 注入:原理与成因」这节课中我会学到什么?
了解经典 SQL 注入、盲注和带外注入,以及参数化查询为何可以防止这些攻击 你通过在浏览器中直接运行的动手代码来练习 Cyber Security Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Cyber Security Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Cyber Security Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「SQL 注入:原理与成因」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Cyber Security Academy 课中编写并运行代码吗?
能。每节 Cyber Security Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- SQL 注入:原理与成因
- 跨站脚本攻击(XSS)
- 跨站请求伪造(CSRF)
- 安全配置错误与暴露的服务