小程序后端攻防实战:WAF 拦截接口注入与批量薅羊毛攻击

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 selectsleep()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;
}

通过以上方法,可有效防御接口注入与批量薅羊毛攻击,平衡安全性与用户体验。