
1) 【一句话结论】
SQL注入是攻击者通过在用户输入中插入恶意SQL代码,绕过Web应用验证逻辑,执行非授权数据库操作的技术。有效防御需从代码层面(参数化查询)和框架层面(ORM工具)双管齐下,分别通过预编译语句和封装对象模型实现防护。
2) 【原理/概念讲解】
老师口吻:SQL注入的核心是“用户输入被当作SQL语句的一部分执行”。简单说,比如Web应用处理用户输入时,直接拼接SQL语句(如SELECT * FROM users WHERE id = '${user_input}'),攻击者输入1' or '1'='1,就会变成SELECT * FROM users WHERE id='1' or '1'='1',导致查询所有用户。原理上,攻击者利用了应用对输入的验证不严格,将恶意SQL代码注入到数据库查询中,绕过应用层的逻辑检查,执行非法操作。类比:就像你给服务员点菜时,故意加一句“或者所有菜都免费”,服务员没检查就执行,结果你免费吃所有菜——应用没验证输入的合法性,数据库就执行了恶意指令。
3) 【对比与适用场景】
| 防御方式 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 参数化查询(代码层面) | 将SQL语句的参数与实际数据分离,通过预编译语句绑定参数 | SQL语句模板与数据分离,输入直接作为参数传递,数据库解析时不会拼接 | 适用于手动编写SQL的代码,需手动处理参数绑定 | 需确保参数类型正确,避免类型混淆;预编译语句需正确使用(如PreparedStatement) |
| ORM工具(框架层面) | 通过对象模型封装数据库操作,自动处理SQL拼接 | 自动生成SQL语句,参数绑定,减少手动拼接风险 | 适用于框架开发(如MyBatis、Hibernate),简化数据库操作 | 需正确配置映射关系,动态SQL需谨慎处理;部分ORM对复杂SQL支持有限 |
4) 【示例】
示例:用户登录场景,手动拼接SQL的注入。
admin' or '1'='1,密码随便。SELECT * FROM users WHERE username='admin' or '1'='1' AND password='password',导致查询所有用户(因为'1'='1为真,条件恒成立)。# 手动拼接SQL(易受注入)
sql = f"SELECT * FROM users WHERE username='{username}' AND password='{password}'"
result = db.execute(sql) # 攻击者输入恶意的username
5) 【面试口播版答案】
“SQL注入是攻击者通过在用户输入中插入恶意SQL代码,绕过Web应用验证逻辑,执行非授权数据库操作的技术。原理上,应用直接拼接用户输入到SQL语句中,导致恶意代码被数据库执行。防御上,代码层面用参数化查询(如预编译语句),将SQL模板与参数分离,避免拼接;框架层面用ORM工具(如MyBatis、Hibernate),自动处理参数绑定和SQL生成。比如手动拼接时,输入1' or '1'='1会变成查询所有用户,而参数化查询会把输入当作参数,数据库解析时不会拼接,从而防止注入。ORM工具通过对象映射,自动生成安全的SQL,减少手动拼接的风险。总结来说,SQL注入的核心是输入验证不足,通过参数化查询和ORM可以有效防御。”
6) 【追问清单】
7) 【常见坑/雷区】