
1) 【一句话结论】
SQL注入是攻击者通过用户输入注入恶意SQL语句,绕过应用层验证,直接操作数据库,从而获取敏感数据或执行非法操作(如删除数据、提升管理员权限)。
2) 【原理/概念讲解】
SQL注入的核心是应用将用户输入直接拼接进SQL语句,导致SQL解析器执行恶意代码。例如,当用户在登录表单输入用户名为“' or 1=1 --”时,原本用于验证用户名的SQL查询“SELECT * FROM users WHERE username='admin'”会被解析为“SELECT * FROM users WHERE username='admin' or 1=1 --”,绕过用户名验证逻辑,返回所有用户数据。类比:就像数据库管理员按正常流程处理一封“正常”的邮件,但邮件内容中隐藏了“执行任意数据库命令”的指令,管理员按流程处理后,执行了隐藏的恶意命令。关键在于“拼接”导致SQL逻辑被篡改,解析器按篡改后的逻辑执行。
3) 【对比与适用场景】
| 维度 | 内容 |
|---|---|
| 定义 | 通过用户输入注入恶意SQL语句,绕过应用层验证,直接操作数据库。 |
| 原理 | 应用未对用户输入进行过滤或转义,将输入直接拼接进SQL语句。 |
| 常见位置 | 用户登录、搜索框、表单提交(如注册、修改信息、订单查询等)。 |
| 防护措施 | - 输入验证:检查输入是否含SQL关键字(如'、or、union等),但存在局限性(如验证逻辑被绕过)。<br>- 参数化查询:使用预编译语句,输入作为参数传递,避免SQL拼接(核心防护手段)。<br>- 预编译语句:数据库层面编译SQL,参数作为占位符(如?),执行时替换,防止解析恶意字符。 |
4) 【示例】
伪代码示例(用户登录场景):
用户输入:用户名 = “admin' or '1'='1”,密码 = “123”
代码(错误处理方式):
String sql = "SELECT * FROM users WHERE username='" + username + "' AND password='" + password + "'";
// 执行sql查询
执行后,实际SQL语句为:SELECT * FROM users WHERE username='admin' or '1'='1' AND password='123'。由于“1='1”为真,查询返回所有用户,包括管理员,从而绕过验证,获取管理员权限。
5) 【面试口播版答案】(约90秒)
“SQL注入是攻击者利用应用对用户输入的SQL语句拼接处理不当,注入恶意SQL代码,绕过应用层验证,直接操作数据库。原理是应用将用户输入直接拼进SQL语句,导致SQL解析器执行恶意语句。比如用户登录时输入‘' or 1=1 --’,原本验证用户名的查询变成‘SELECT * FROM users WHERE username='admin' or 1=1 --’,绕过验证。360安全卫士的防护措施包括输入验证(检查输入是否为SQL关键字,如'、or等,防止恶意字符注入,但可能被绕过,比如用双引号绕过单引号验证),参数化查询(使用PreparedStatement,SQL语句模板不变,用户输入作为参数传递,数据库预编译SQL,参数作为占位符,执行时替换,避免解析恶意字符,这是核心防护手段)。”
6) 【追问清单】
7) 【常见坑/雷区】