一、核心防护目标说明

302跳转最常见的安全风险是开放重定向漏洞,攻击者构造带恶意域名的跳转链接,诱导用户点击后跳转到钓鱼站点窃取信息。本文覆盖Nginx、SpringBoot两种最常见场景,给出可直接复制的配置,无需额外基础即可落地。
二、Nginx层302跳转防护实操
2.1 环境检查
先执行命令确认Nginx版本≥1.18,低版本正则匹配存在兼容问题:
```
nginx -v
```
如果版本不符合,对应系统执行升级命令:
CentOS/RHEL系统:
```
yum update -y nginx
```
Debian/Ubuntu系统:
```
apt update && apt upgrade -y nginx
```
2.2 配置步骤
- 步骤1:打开站点配置文件,一般路径为
/etc/nginx/conf.d/你的域名.conf,用vim打开:
```
vim /etc/nginx/conf.d/your-domain.conf
```
- 步骤2:在server块内添加以下规则,替换示例域名为你自己允许的合法域名即可:
```
允许跳转的域名列表,多个域名用|分隔
set $allow_redirect_domains "example.com|your-domain.com";
匹配跳转参数中的域名,如果你用的参数名不是redirect_url,修改$arg_redirect_url为你的参数名
if ($arg_redirect_url ~ ^https?://([^/]+)) {
set $redirect_domain $1;
拦截不在白名单内的跳转
if ($redirect_domain !~ $allow_redirect_domains) {
return 403;
}
}
```
- 步骤3:检查配置语法并重载Nginx:
```
nginx -t && nginx -s reload
```

如果输出显示test is successful,说明配置无误,否则检查括号、引号是否闭合完整。
三、SpringBoot后端302跳转防护实操
对于后端控制的302跳转,通过全局拦截器统一校验,直接复制以下代码,替换配置项即可使用:
3.1 创建拦截器类
新建RedirectSecurityInterceptor.java,填入以下完整代码:
```
package com.your.project.config;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RedirectSecurityInterceptor implements HandlerInterceptor {
// 替换为你允许跳转的域名
private static final List
ALLOW_DOMAINS = Arrays.asList(
"your-domain.com",
"other-allow-domain.com"
);
// 匹配http/https域名的正则,无需修改
private static final Pattern DOMAIN_PATTERN = Pattern.compile("^https?://([^/?]+)");
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
// 如果你的跳转参数名不是redirect_url,修改这里
String redirectUrl = request.getParameter("redirect_url");
if (redirectUrl == null || redirectUrl.isBlank()) {
return true;
}
Matcher matcher = DOMAIN_PATTERN.matcher(redirectUrl);
// 相对路径跳转直接放行
if (!matcher.find()) {
return true;
}
String domain = matcher.group(1).toLowerCase();
// 子域名也支持匹配,比如你的白名单是a.com,b.a.com也会被放行
boolean isAllow = ALLOW_DOMAINS.stream().anyMatch(domain::endsWith);
if (!isAllow) {
response.sendError(HttpServletResponse.SC_FORBIDDEN, "非法跳转地址");
return false;
}
return true;
}
}
```
3.2 注册拦截器
新建配置类WebConfig.java,填入以下内容:
```
package com.your.project.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 拦截所有请求,可修改addPathPatterns调整拦截范围,比如只拦截登录相关接口
registry.addInterceptor(new RedirectSecurityInterceptor())
.addPathPatterns("/");
}
}
```
重启SpringBoot项目即可生效。
四、防护效果验证

配置完成后按以下步骤验证,确保防护生效且无误拦截:
- 1. 构造非法测试链接:
https://你的域名/跳转接口?redirect_url=https://恶意钓鱼.com
- 2. 访问该链接,如果返回403状态码,说明非法跳转拦截生效
- 3. 构造合法测试链接:
https://你的域名/跳转接口?redirect_url=https://你的合法域名/xxx
- 4. 访问该链接可以正常跳转,说明没有误拦截,配置完成
五、额外加固措施
如果对安全性要求更高,可以添加以下两项额外防护:
- 跳转参数签名校验:后端生成跳转链接时,添加签名参数
sign=MD5(redirect_url + 你的私密密钥),拦截器内新增逻辑:验证签名一致才允许跳转,可彻底拦截攻击者构造的恶意跳转
- 禁止所有外部跳转:如果你的业务不需要跳转到外部域名,直接将规则修改为:只要匹配到
http://或https://开头的跳转,直接返回403,彻底杜绝风险