
1) 【一句话结论】SQL注入是攻击者通过恶意构造用户输入,将非法SQL代码注入到Web应用的数据库查询中,导致数据泄露或权限提升。360通过参数化查询、预编译语句等防御技术拦截注入,同时采用加盐哈希、加密存储等方式保护用户密码等敏感数据在数据库中的安全。
2) 【原理/概念讲解】老师口吻,解释SQL注入原理:当Web应用将用户输入直接拼接进SQL语句时,攻击者可构造包含特殊SQL字符(如单引号、分号)或逻辑条件的输入,使数据库执行非预期查询。例如,登录接口的SQL为SELECT * FROM users WHERE username='user_input' AND password='pass_input',若用户输入' or '1'='1'作为用户名,拼接后SQL变为SELECT * FROM users WHERE username='' or '1'='1' AND password='pass_input',因'1'='1'恒成立,查询返回所有用户数据。
防御手段方面,参数化查询(预编译语句)将SQL与参数分离,数据库先编译SQL结构再绑定参数,输入不会被当作SQL代码执行;输入过滤是对用户输入进行字符过滤(如过滤单引号),但存在绕过风险(如编码绕过);保护存储时,密码等敏感数据用加盐哈希(如bcrypt),通过随机盐值和多次哈希,即使哈希泄露也无法还原原始密码;隐私数据用加密存储(如AES-256),但需注意密钥安全管理。
3) 【对比与适用场景】
| 方法 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 参数化查询 | 将SQL与参数分离,参数作为独立对象传递 | 防御注入能力强,数据库自动处理参数,不会拼接 | Web应用数据库查询(用户输入相关) | 需支持预编译的数据库(MySQL/PostgreSQL/SQL Server) |
| 预编译语句 | 数据库预编译SQL,参数动态绑定 | 同参数化查询,防御注入,性能较好 | 高并发数据库操作(如登录、查询) | 复杂查询(如子查询)支持良好 |
| 输入过滤 | 对用户输入过滤危险字符(如单引号) | 简单易实现,但易被绕过 | 安全性要求不高的场景(辅助手段) | 需精心设计过滤规则,否则易被绕过 |
| 加盐哈希 | 密码添加随机盐值后哈希 | 哈希不可逆,盐值随机,防彩虹表 | 密码存储(如用户登录) | 需强哈希算法(如bcrypt)和随机盐生成 |
| 加密存储 | 敏感数据加密后存储 | 存储时加密,解密后注意安全 | 非密码类敏感数据(如个人信息) | 需安全加密算法(如AES-256)和密钥管理 |
4) 【示例】
正常登录逻辑(存在注入风险):
// PHP+MySQL,拼接用户输入
$username = $_GET['username'];
$password = $_GET['password'];
$sql = "SELECT * FROM users WHERE username='$username' AND password='$password'";
$result = $conn->query($sql);
当用户输入username='admin' or '1'='1',password='anything'时,SQL变为:
SELECT * FROM users WHERE username='admin' or '1'='1' AND password='anything'
因'1'='1'为真,返回所有用户数据。
参数化查询(防御注入):
$username = $_GET['username'];
$password = $_GET['password'];
$stmt = $conn->prepare("SELECT * FROM users WHERE username=? AND password=?");
$stmt->bind_param("ss", $username, $password); // 参数绑定
$stmt->execute();
$result = $stmt->get_result();
无论输入如何,数据库仅将参数视为数据,不会执行恶意SQL。
5) 【面试口播版答案】
“面试官您好,SQL注入攻击的原理是攻击者通过构造包含恶意SQL代码的用户输入,让Web应用将这部分代码直接拼接进数据库查询语句中,从而绕过应用层验证,执行非预期操作。比如一个登录接口,原本的SQL是SELECT * FROM users WHERE username='user' AND password='pass',如果用户输入' or '1'='1'作为用户名,那么拼接后的SQL变成SELECT * FROM users WHERE username='' or '1'='1' AND password='pass',这样查询会返回所有用户数据,这就是SQL注入。
在360安全产品中,我们主要通过参数化查询(预编译语句)来防御,比如将用户输入作为参数传递,数据库引擎先编译SQL结构,再绑定参数,这样输入不会被当作SQL代码执行。同时,输入过滤作为辅助手段,对用户输入进行白名单过滤,但更推荐参数化查询。对于用户数据存储安全,比如密码,我们采用加盐哈希的方式,比如使用bcrypt算法,先给密码添加随机盐值,再进行多次哈希处理,这样即使数据库被泄露,攻击者也无法通过彩虹表还原原始密码。对于其他隐私信息,比如用户个人信息,我们采用加密存储,比如AES-256加密,但要注意密钥的安全管理,避免密钥泄露导致数据被解密。”
6) 【追问清单】
random_bytes)生成。若重复使用盐值,相同密码的哈希值相同,攻击者可通过彩虹表快速破解,因此必须保证盐值的唯一性和随机性。7) 【常见坑/雷区】