java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > SpringBoot Nginx免鉴权接口安全防护

基于SpringBoot+Nginx实现免鉴权接口安全防护方案

作者:xixingzhe2

本文围绕SpringBoot与Nginx协同防护免鉴权接口(如登录、验证码、注册等)展开,提出三层防护体系:Nginx层实现IP限流、黑名单封禁、参数过滤、真实IP校验及人机校验前置拦截,需要的朋友可以参考下

一、核心风险说明

免鉴权接口(登录、验证码、注册、健康检查、公开查询等)无 token 校验,常见攻击:

  1. 暴力 破解(登录密码 / 验证码爆破)
  2. 高频刷接口(短信轰炸、注册灌水、DoS)
  3. SQL 注入、XSS、路径遍历
  4. 爬虫批量拉取公开数据
  5. IP 恶意请求、CC 攻击
  6. 越权、参数篡改、重放攻击

防护分三层:Nginx 层前置拦截(低成本、高性能) + SpringBoot 应用层校验(业务逻辑防护) + 基础设施兜底。

二、Nginx 层防护(优先做,不占用 Java 服务资源)

1. 单 IP 限流,防高频刷接口(CC / 短信轰炸)

对所有免登接口单独配置限流,区分普通接口 / 验证码 / 登录接口(验证码限流更严)

# 全局限流配置 http块
http {
    # 按IP限流,10M内存存储IP
    limit_req_zone $binary_remote_addr zone=free_api:10m rate=10r/s;
    # 验证码单独限流,更严格
    limit_req_zone $binary_remote_addr zone=code_api:10m rate=1r/3s;
    # 登录接口限流
    limit_req_zone $binary_remote_addr zone=login_api:10m rate=2r/m;
}
server {
    location /api/login {
        limit_req zone=login_api burst=3 nodelay;
        proxy_pass http://springboot;
    }
    location /api/sendCode {
        limit_req zone=code_api burst=1 nodelay;
    }
    # 所有免鉴权接口统一限流
    location ~ ^/api/(public|register|health) {
        limit_req zone=free_api burst=5 nodelay;
        proxy_pass http://springboot;
    }
}

参数说明:

1.1 zone=free_api:10m

部分说明
zone关键字,表示定义一块共享内存区域
free_api自定义名称,在后续 limit_req 指令中引用它
10m内存大小为 10 MB(m 代表兆字节)

内存能存储多少数据?

选择多大内存合适?

# 小型业务(日活 < 1万)
zone=free_api:1m
# 中等业务(日活 1万-50万)
zone=free_api:10m
# 大型业务(日活 > 50万)
zone=free_api:50m

1.2 rate=10r/s

部分说明
rate关键字,定义速率限制
10r10 个请求(r = request)
/s每秒(per second),也可以使用 /m(每分钟)

常用速率示例

# 每秒 1 个请求(适合防止暴力 破解登录接口)
rate=1r/s;
# 每分钟 60 个请求(等价于每秒1个,但允许突发)
rate=60r/m;
# 每秒 100 个请求(适合高并发公开API)
rate=100r/s;

重要概念:速率是如何计算的?

2. IP 黑名单 + 临时封禁(爆破拦截)

配合限流自动拉黑恶意 IP,使用 nginx lua/deny,或定时脚本同步攻击 IP

# 封禁恶意IP列表
deny 192.168.1.100;
# 允许内网
allow 127.0.0.1;
allow 192.168.1.0/24;
deny all;

3. 请求参数过滤,拦截注入攻击

Nginx 匹配 URL / 参数关键字,拦截 SQL 注入、XSS、路径遍历

if ($query_string ~* "union|select|and|or|alert|<script>|../") {
    return 403;
}
# 拦截异常请求方法
if ($request_method !~ ^(GET|POST)$ ) {
    return 405;
}
# 限制请求体大小,防大报文DoS
client_max_body_size 10k;

4. 伪造 IP 防护(必须配置,避免黑客伪造 X-Forwarded-For 绕过限流)

如果前端有 CDN / 负载均衡,正确取真实客户端 IP,防止伪造 IP 无限刷接口:

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 信任CDN内网IP,防止伪造XFF
real_ip_header X-Forwarded-For;
set_real_ip_from 10.0.0.0/8;

5. 验证码 / 登录接口增加人机校验拦截

Nginx 拦截无验证码、无滑块票据的请求,结合前端传入captchaId参数校验,无则 403。

6. 关闭敏感头、防信息泄露

server_tokens off; # 隐藏nginx版本
proxy_hide_header Server;
add_header X-Frame-Options DENY;
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options nosniff;

三、SpringBoot 应用层防护(业务级安全,Nginx 挡不住的恶意请求)

1. 接口粒度区分免鉴权路径(统一拦截器 / 过滤器)

使用 Spring Security / 自定义 Filter,白名单放行免登接口,其余强制 token;禁止全局开放。

Spring Security 示例

@Configuration
public class SecurityConfig {
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.authorizeHttpRequests(auth -> auth
                // 免鉴权白名单
                .requestMatchers("/api/login", "/api/sendCode", "/api/public/**", "/actuator/health").permitAll()
                // 其他全部需要认证
                .anyRequest().authenticated()
        );
        return http.build();
    }
}

2. 业务层限流(分布式场景,Nginx 单机限流失效补充)

使用 Redis 实现分布式 IP 限流,针对登录、验证码做次数限制:

伪代码示例:

// 登录失败计数
String key = "login:fail:" + ip;
Long count = redisTemplate.opsForValue().increment(key, 1);
if(count == 1) redisTemplate.expire(key, 10, TimeUnit.MINUTES);
if(count > 5) return "登录过于频繁,请稍后再试";

3. 人机验证(核心防刷手段)

所有高危免登接口强制人机校验:

  1. 图形验证码(登录 / 注册)
  2. 滑块 / 行为验证码(极验、阿里云验证码)
  3. 设备指纹:前端采集浏览器指纹、UA、设备 ID 上传后台校验。

无合法验证码票据直接拒绝业务处理。

4. 请求参数强校验(防注入、越权)

使用 Hibernate Validator 全局校验所有入参:

@PostMapping("/sendCode")
public Result sendCode(@NotBlank @Pattern(regexp = "^1[3-9]\\d{9}$") String phone) {
    // 业务逻辑
}

全局异常拦截非法参数请求,记录攻击日志。

5. 防重放攻击(公开查询接口)

给前端分配临时签名参数 timestamp + nonce + sign

  1. 前端用密钥对参数 + 时间戳加密生成 sign
  2. 后端校验:时间戳 5 分钟内有效、nonce 一次性存入 Redis 去重、sign 校验一致 防止抓包后重复调用免登接口拉取数据。

6. 敏感操作风控规则

7. 全局异常日志 + 攻击记录

拦截所有 400、403、限流、参数非法请求,记录:IP、接口、参数、UA,定时统计恶意 IP 推送告警。

四、分布式 / 集群补充方案

五、不同免鉴权接口差异化防护策略

接口类型核心攻击防护重点
登录接口密码暴力 破解登录失败计数封禁、人机验证、IP 限流
短信验证码短信轰炸手机号 + IP 双重限流、每日上限
注册接口灌水批量注册设备指纹、滑块验证码、IP 频次
公开查询接口爬虫批量爬取签名防重放、分页限制、IP 限流
健康检查 / 监控扫描探测内网 IP 白名单,外网直接禁止访问

六、最简落地执行顺序

七、常见踩坑点

以上就是基于SpringBoot+Nginx实现免鉴权接口安全防护方案的详细内容,更多关于SpringBoot Nginx免鉴权接口安全防护的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文