
SQL注入漏洞本质是用户输入未有效过滤,导致恶意SQL语句被数据库执行;针对360DB的存储过程、JSON处理等特性,通过输入验证(如参数化、JSON字段白名单)和数据库审计(日志分析+异常检测),从源头和事后监控双维度防止此类漏洞。
老师口吻:SQL注入的核心是“用户输入被直接拼接进SQL语句”,导致数据库执行恶意逻辑。举个例子:正常调用存储过程是EXEC sp_get_user 1,若用户输入' or '1'='1 --,拼接后变成EXEC sp_get_user ' or '1'='1 --,结果查询所有用户。类比:就像给数据库“问错问题”,把原本的“找特定用户”变成“找所有用户”。关键在于,攻击者通过特殊字符(如单引号、分号)改变SQL逻辑,绕过应用层的输入检查。更深入来说,时间盲注是通过SLEEP(5)判断执行时间,而基于错误信息的注入则是通过SQL错误提示获取信息。对于360DB,存储过程支持动态参数,若参数未验证,仍可能被注入,比如存储过程内部拼接SQL时未处理输入。
| 方法 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 输入验证 | 对用户输入进行合法性检查(如白名单、正则匹配、JSON字段验证) | 前端/后端实时过滤,防止恶意输入进入系统 | 所有用户输入点(表单、API参数、JSON数据等) | 需覆盖所有输入点,复杂输入(如JSON、动态SQL)可能漏,需解构后逐字段验证 |
| 数据库审计 | 记录数据库所有操作(SQL语句、用户、时间、执行时间) | 事后追溯、检测异常SQL行为 | 服务器端、数据库层面(对关键操作开启) | 产生大量日志,需处理性能,可能误报(如正常批量删除被误判) |
伪代码示例:处理用户输入的JSON并验证字段白名单(结合360DB的JSON输入场景)。
import json
def validate_json_input(json_str, allowed_fields):
try:
data = json.loads(json_str)
for field in data:
if field not in allowed_fields:
return False, f"字段 {field} 不在白名单内"
return True, data
except json.JSONDecodeError:
return False, "输入不是有效的JSON"
# 示例:用户输入JSON,只允许id和name字段
allowed_fields = {"id", "name"}
user_input = '{"id": "1", "name": "test", "secret": "bad"}'
is_valid, result = validate_json_input(user_input, allowed_fields)
if is_valid:
print("验证通过,数据:", result)
else:
print("验证失败:", result)
当用户输入包含未允许的字段(如secret),验证失败,避免注入。
存储过程参数验证示例:
-- 正常调用
EXEC sp_get_user @user_id = 1;
-- 被注入的调用
EXEC sp_get_user @user_id = ' or '1'='1 --';
通过参数化(如存储过程参数绑定)避免拼接,防止注入。
面试官您好,SQL注入的核心是用户输入未过滤,导致恶意SQL语句被数据库执行。比如用户输入' or '1'='1,拼接后查询所有用户。针对360DB,我们通过输入验证(如参数化查询、JSON字段白名单)和数据库审计(记录所有SQL操作并检测异常)来防护。输入验证方面,比如用预编译语句,把用户输入当参数,避免拼接;审计则开启数据库日志,配置规则检测异常SQL(如带单引号、复杂逻辑),这样能从源头和事后监控防止注入。具体来说,对于存储过程,需验证调用参数,避免动态拼接SQL;对于JSON输入,解构后逐字段白名单验证,确保只有允许的字段和值。