WAF拦截接口注入攻击的防御方法
输入验证与过滤
对所有用户输入进行严格验证,包括长度、类型、格式等。使用正则表达式或白名单机制过滤特殊字符,如单引号、分号、注释符(--、/* */)等。
参数化查询与ORM
避免拼接SQL语句,采用参数化查询或ORM框架(如MyBatis、Hibernate)。例如:
java
// 错误示例:拼接SQL
String sql = "SELECT * FROM users WHERE id = " + userInput;
// 正确示例:参数化查询
PreparedStatement stmt = connection.prepareStatement("SELECT * FROM users WHERE id = ?");
stmt.setInt(1, Integer.parseInt(userInput));
WAF规则配置
配置WAF(如ModSecurity、阿里云WAF)规则拦截常见注入特征:
- 检测
union select、sleep()、benchmark()等关键词。 - 拦截异常HTTP头(如
X-Forwarded-For携带SQL片段)。 - 限制高频敏感操作(如密集的
DROP语句)。
批量薅羊毛攻击的防护策略
行为分析与限流
通过风控系统识别异常行为:
- 同一IP/设备ID短时间内发起大量相同请求(如领券、抽奖)。
- 账号行为模式异常(如新注册账号立即参与活动)。
- 接口限流:针对关键接口设置QPS阈值(如10次/分钟)。
验证码与人机校验
- 高频操作前触发验证码(如滑块、短信验证码)。
- 无感验证方案:通过用户行为画像(鼠标轨迹、点击间隔)区分机器流量。
业务逻辑加固
- 活动规则防绕过:校验前置条件(如用户等级、历史订单)。
- 数据去重:使用唯一键(如用户ID+活动ID)防止重复领取。
- 异步审核机制:延迟发放奖励,人工审核异常订单。
日志监控与应急响应
全链路日志追踪
记录关键信息:用户ID、IP、设备指纹、请求参数、响应结果。通过ELK或日志服务实时分析异常请求。
自动化封禁与告警
- 对恶意IP/账号自动封禁(如Redis黑名单)。
- 设置告警规则(如1小时内同一接口错误率超过30%)。
漏洞修复闭环
定期进行渗透测试,修复漏洞后验证规则有效性。例如,通过注入测试工具(如SQLMap)验证WAF拦截率。
代码示例:接口限流实现
java
// 基于Redis的令牌桶限流
public boolean rateLimit(String key, int maxPermits, int rate) {
Jedis jedis = new Jedis("localhost");
long now = System.currentTimeMillis();
String script =
"local tokens = tonumber(redis.call('get', KEYS[1])) or 0 " +
"local lastTime = tonumber(redis.call('get', KEYS[1] .. ':ts')) or 0 " +
"local delta = math.max(0, now - lastTime) * rate / 1000 " +
"tokens = math.min(tokens + delta, maxPermits) " +
"if tokens >= 1 then " +
"redis.call('set', KEYS[1], tokens - 1) " +
"redis.call('set', KEYS[1] .. ':ts', now) " +
"return true " +
"else " +
"return false " +
"end";
Object result = jedis.eval(script, 1, key);
return (boolean) result;
}
通过以上方法,可有效防御接口注入与批量薅羊毛攻击,平衡安全性与用户体验。