**问题描述:**
在访问某些Web应用时,出现“ERROR RequestSecurityFilter:106 - The Referer request header is not found or malformed”错误,导致请求被拒绝。此问题通常出现在安全过滤器(如Spring Security)对请求来源进行校验时,发现Referer头缺失或格式不正确。常见于前后端分离架构或API调用中,浏览器或客户端未正确设置Referer头,或者CSRF防护机制配置不当。如何修复该错误并确保请求正常通过安全验证?
ERROR RequestSecurityFilter:106 - The Referer request header is not found or malformed. How to fix it?
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
1条回答 默认 最新
kylin小鸡内裤 2025-06-27 01:46关注一、问题背景与现象描述
在现代Web应用开发中,前后端分离架构广泛采用,前端通过AJAX或Fetch API向后端发起请求。在此过程中,部分请求可能遇到如下错误:
ERROR RequestSecurityFilter:106 - The Referer request header is not found or malformed该错误表明服务器端的安全过滤器(如Spring Security中的自定义过滤器)检测到请求头中缺少Referer字段,或者其格式不正确,导致请求被拒绝。
二、Referer头的作用及常见场景
HTTP请求头中的
Referer字段用于标识当前请求是从哪个页面发起的,通常用于防止CSRF攻击、防盗链等安全机制。在以下几种典型场景中,可能出现Referer缺失或异常的问题:
- 使用Postman或curl等工具测试API接口时未手动设置Referer头;
- 浏览器出于隐私保护机制(如Referrer-Policy配置)未发送Referer;
- 前后端部署在不同域名下,跨域请求默认不携带Referer;
- 安全框架配置不当,强制校验Referer字段。
三、分析流程图解
graph TD A[用户发起请求] --> B{是否包含Referer头?} B -- 否 --> C[检查客户端是否主动设置] C --> D{是否为跨域请求?} D -- 是 --> E[查看CORS配置] D -- 否 --> F[检查浏览器策略] B -- 是 --> G{Referer格式是否合法?} G -- 否 --> H[日志报错:malformed Referer] G -- 是 --> I[请求继续处理]四、解决方案详解
针对上述错误,我们可以从多个层面进行修复和优化,确保请求能正常通过安全验证。
1. 客户端主动设置Referer头
在前端代码中明确指定Referer值,适用于浏览器环境或测试工具。
// 使用Fetch API示例 fetch('/api/login', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Referer': 'https://frontend.example.com' }, body: JSON.stringify({ username: 'test', password: '123456' }) });2. 配置浏览器Referrer策略
在HTML标签中添加
referrerpolicy属性,控制请求行为:<meta name="referrer" content="no-referrer-when-downgrade">常用策略包括:
策略名称 说明 no-referrer 不发送Referer头 no-referrer-when-downgrade 默认值,HTTPS跳转HTTP时不发送Referer origin 只发送源信息(协议+域名+端口) 3. 调整Spring Security配置
如果业务逻辑中不需要严格依赖Referer头,可以在安全配置中移除相关校验逻辑:
@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .anyRequest().authenticated() .and() .csrf().disable() // 若无表单提交需求可关闭CSRF .headers().referrerPolicy(ReferrerPolicyHeaderWriter.ReferrerPolicy.NO_REFERRER_WHEN_DOWNGRADE); } }4. 自定义过滤器逻辑
若需保留Referer校验但允许某些特定请求绕过,则可在自定义过滤器中增加白名单判断逻辑:
public class CustomRequestSecurityFilter extends OncePerRequestFilter { private final List whiteList = Arrays.asList("/api/public/**"); @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { String referer = request.getHeader("Referer"); if (isWhiteListed(request.getRequestURI())) { filterChain.doFilter(request, response); return; } if (referer == null || !isValidReferer(referer)) { response.sendError(HttpServletResponse.SC_FORBIDDEN, "Invalid Referer header"); return; } filterChain.doFilter(request, response); } private boolean isWhiteListed(String uri) { return whiteList.stream().anyMatch(pattern -> new AntPathMatcher().match(pattern, uri)); } private boolean isValidReferer(String referer) { // 实现具体的Referer校验逻辑 return referer.startsWith("https://yourdomain.com"); } }五、总结性建议与最佳实践
为避免此类问题反复出现,建议遵循以下原则:
- 在前后端通信中明确约定并统一Referer头的使用规范;
- 对于公共API接口,合理放宽安全策略,避免过度依赖Referer;
- 定期审查安全过滤器逻辑,确保不过度限制合法请求;
- 结合CORS策略与CSRF防护机制,构建多层次的安全防线;
- 在生产环境中启用详细的日志记录,便于快速定位Referer相关问题。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报