SQL注入是Web安全领域长期存在的高危漏洞,攻击者通过在用户输入中插入恶意SQL片段,绕过应用校验直接操作数据库,可能造成数据泄露、数据篡改甚至整个数据库被拖库。应对这类攻击需要从注入测试防御和动态监测两个维度共同发力,构建完整的防护链路。

SQL注入的常见测试场景
在常规的注入测试中,攻击者通常会尝试以下几种常见方式:
- 在登录框输入
admin' OR 1=1 --尝试绕过账号密码校验 - 在搜索框输入
' UNION SELECT username,password FROM user --尝试获取其他表数据 - 在参数中插入
'; DROP TABLE order --尝试删除数据库表
应对SQL注入测试的核心防御手段
1. 使用参数化查询
参数化查询是最有效的SQL注入防御方式,它把用户输入作为参数传递,而不是拼接进SQL语句,数据库会将参数内容当作纯数据处理,不会执行其中的SQL指令。以下是Java中使用PreparedStatement的示例:
// 错误写法:直接拼接SQL,存在注入风险 String sql = "SELECT * FROM user WHERE username = '" + inputUsername + "'"; Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql); // 正确写法:使用参数化查询 String sql = "SELECT * FROM user WHERE username = ?"; PreparedStatement pstmt = conn.prepareStatement(sql); // 设置参数,输入内容会被当作纯字符串处理 pstmt.setString(1, inputUsername); ResultSet rs = pstmt.executeQuery();
2. 严格的输入校验
对用户输入的内容做格式校验,比如手机号参数只允许数字和长度限制,邮箱参数只允许符合邮箱格式的字符,过滤掉单引号、分号、注释符等危险字符。以下是Python中简单的输入校验示例:
import re
def validate_username(input_str):
# 只允许字母、数字、下划线,长度3-20位
pattern = r'^[a-zA-Z0-9_]{3,20}$'
if re.match(pattern, input_str):
return True
return False
user_input = input("请输入用户名:")
if not validate_username(user_input):
print("用户名格式不合法")
3. 最小权限原则
给应用连接数据库的账号只分配必要的权限,比如普通查询接口只给SELECT权限,不要给DROP、ALTER等高危权限,即使发生注入攻击,也能把损失降到最低。
配置动态安全监测规则
动态安全监测可以在应用运行时实时识别SQL注入攻击行为,及时拦截并告警,常见的规则配置可以从以下几个维度入手:
1. 请求特征匹配规则
识别请求参数中包含的典型SQL注入特征,比如常见的SQL关键字、注释符、逻辑判断语句等,配置匹配规则时需要注意避免误报,以下是常见的特征匹配项:
| 特征类型 | 匹配内容示例 | 说明 |
|---|---|---|
| SQL关键字 | SELECT, UNION, DROP, INSERT, UPDATE | 非业务场景下的突然出现需要告警 |
| 注释符 | --, #, /* */ | 正常用户输入很少包含SQL注释符 |
| 逻辑判断 | OR 1=1, AND 1=2, ' OR 'a'='a | 典型的注入绕过逻辑 |
2. 行为异常监测规则
除了特征匹配,还可以配置行为异常规则,比如同一个IP短时间内发送大量包含SQL特征的请求,或者同一个账号尝试不同的注入 payload,这类异常行为可以直接触发拦截。以下是Nginx层面配置简单监测规则的示例:
# 定义SQL注入特征正则
set $sql_inject_regex "(select|union|drop|insert|update|delete|'|--|#|/*)";
# 匹配请求参数中的注入特征
if ($args ~* $sql_inject_regex) {
# 返回403拦截,同时记录日志
return 403;
access_log /var/log/nginx/sql_inject.log;
}
# 匹配请求体中的注入特征
if ($request_body ~* $sql_inject_regex) {
return 403;
access_log /var/log/nginx/sql_inject.log;
}
3. 规则动态调整机制
动态监测规则需要支持定期更新,根据新出现的注入攻击手法补充新的特征匹配项,同时可以设置白名单,把业务正常需要的特殊参数加入白名单,减少误报。比如业务本身需要传递包含SQL片段的合法参数时,可以把对应的接口路径加入白名单,跳过该路径的注入检测。
总结
应对SQL注入测试需要先把防御工作做在前面,通过参数化查询、输入校验、最小权限配置从根源上降低注入风险,再配合动态安全监测规则,实时识别绕过防御的攻击行为,形成纵深防护体系。规则配置完成后需要定期做注入测试验证,确保规则有效且没有影响正常业务运行。