
1) 【一句话结论】在项目中对用户注册模块的SQL注入漏洞进行修复,通过代码审计定位输入拼接的SQL语句,采用参数化查询技术实现,测试验证后确认漏洞已关闭,总结经验强化输入验证与参数化规范。
2) 【原理/概念讲解】SQL注入是指攻击者将恶意SQL代码注入到应用程序的输入中,导致数据库执行非预期操作。原理是应用将用户输入直接拼接进SQL语句,当输入含特殊字符(如单引号)时,破坏SQL语法,插入恶意语句。类比:用户输入“用户名=’admin’ or ‘1’=’1”时,数据库误认为完整SQL语句,执行“INSERT INTO users (username, password) VALUES ('admin' OR '1'='1', '123')”并插入非法用户(绕过验证)。核心是输入与SQL语句的拼接导致恶意代码执行。
3) 【对比与适用场景】
| 特性 | SQL注入 | XSS(跨站脚本) |
|---|---|---|
| 定义 | 用户输入直接拼接SQL语句,影响数据库 | 用户输入注入脚本到页面,影响浏览器 |
| 攻击方式 | 拼接SQL语句,绕过验证 | 注入JavaScript等脚本到页面输出 |
| 影响目标 | 数据库(数据泄露、修改、删除) | 浏览器(执行恶意脚本,窃取Cookie等) |
| 常见位置 | 数据库查询、插入、更新语句 | 页面输出、表单、URL参数 |
| 修复方法 | 参数化查询、预编译、输入验证 | 输出编码、内容安全策略(CSP)、模板引擎 |
| 使用场景 | 需要动态查询/插入数据库的接口 | 需要用户输入显示在页面的场景 |
| 注意点 | 避免手动转义(易遗漏复杂组合) | 避免直接拼接用户输入到HTML |
4) 【示例】
假设项目用户注册接口伪代码(Python,未过滤输入):
def register(username, password):
sql = f"INSERT INTO users (username, password) VALUES ('{username}', '{password}')"
db.execute(sql) # 直接拼接用户输入
当用户输入 admin' OR '1'='1(用户名),密码为空,SQL语句变为:
INSERT INTO users (username, password) VALUES ('admin' OR '1'='1', ''),导致插入非法用户(绕过用户名唯一性验证)。
5) 【面试口播版答案】
我当时参与修复过一个用户注册模块的SQL注入漏洞。具体来说,通过代码审计,检查注册页面的SQL查询代码,发现username和password直接拼接进SQL语句,没做任何参数化处理。定位过程就是看代码里的SQL拼接点,比如检查INSERT INTO users (username, password) VALUES ('{username}', '{password}')这样的语句,当用户输入带单引号的字符串时,破坏SQL语法,比如输入' OR '1'='1作为用户名,导致SQL变成INSERT INTO users (username, password) VALUES ('admin' OR '1'='1', '123'),绕过验证插入非法用户。分析后确定漏洞,修复方案是将SQL改为参数化查询,用预编译语句绑定参数,避免拼接导致的注入。测试验证时,用OWASP ZAP输入恶意字符串,检查返回是否包含插入的非法用户数据;再用正常用户名密码注册,验证业务功能正常。后续总结,发现所有数据库操作都要用参数化,避免类似问题,并提醒团队严格遵循输入验证与参数化规范。
6) 【追问清单】
7) 【常见坑/雷区】