普通网友 2025-06-27 01:45 采纳率: 98%
浏览 1
已采纳

ERROR RequestSecurityFilter:106 - The Referer request header is not found or malformed. How to fix it?

**问题描述:** 在访问某些Web应用时,出现“ERROR RequestSecurityFilter:106 - The Referer request header is not found or malformed”错误,导致请求被拒绝。此问题通常出现在安全过滤器(如Spring Security)对请求来源进行校验时,发现Referer头缺失或格式不正确。常见于前后端分离架构或API调用中,浏览器或客户端未正确设置Referer头,或者CSRF防护机制配置不当。如何修复该错误并确保请求正常通过安全验证?
  • 写回答

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");
        }
    }

    五、总结性建议与最佳实践

    为避免此类问题反复出现,建议遵循以下原则:

    1. 在前后端通信中明确约定并统一Referer头的使用规范;
    2. 对于公共API接口,合理放宽安全策略,避免过度依赖Referer;
    3. 定期审查安全过滤器逻辑,确保不过度限制合法请求;
    4. 结合CORS策略与CSRF防护机制,构建多层次的安全防线;
    5. 在生产环境中启用详细的日志记录,便于快速定位Referer相关问题。
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 10月23日
  • 创建了问题 6月27日