如何在Spring Boot中禁用特定的头信息

6

在Spring Boot中禁用以下标头是否有可能?

X-Forwarded-Host: 
X-Host: 
X-Forwarded-Server:

以下方法对我没有起作用

class MyFilter extends OncePerRequestFilter {
    @Override
    public void doFilterInternal(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        chain.doFilter(request, new HttpServletResponseWrapper((HttpServletResponse) response) {
            public void setHeader(String name, String value) {
                if (!name.equalsIgnoreCase("X-Forwarded-Host")) {
                    super.setHeader(name, value);
                }
            }
        });
    }
2个回答

0

让我们试着放眼更广,开始思考请求-响应生命周期。

一旦客户端发起请求,请求/响应在客户端和应用程序之间经过一系列的停留和层次。可能会有防火墙、负载均衡器、反向代理、中间件等。另一方面,根据提供应用程序的应用服务器,这些标头也可能被添加。如果除了应用程序之外还有添加、删除或重写标头的机制,那么这些标头应该已经在应用程序之外进行管理。

话虽如此,如果标头是由应用程序添加的,它们可以在应用程序内部进行管理。但是,如果标头是由其他停留或层添加的,则应按特定配置进行管理。

除了一般的标头外,如果我们考虑这些特定的标头:根据我的一般经验,当客户端和应用程序之间存在反向代理时,您提供的标头将被添加。

您可以利用更多关于它们的信息:https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#x-headers

总之,您应该根据它们被添加的方式和原因来管理这些标头。


-1
如果您想禁用所有默认标头,可以执行以下操作:
@EnableWebSecurity
public class WebSecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            // ...
            .headers(headers -> headers
                // do not use any default headers unless explicitly listed
                .defaultsDisabled()
                .cacheControl(withDefaults())
            );
        return http.build();
    }
}

要禁用特定的内容,您可以采用相同的策略。

参考:https://docs.spring.io/spring-security/reference/5.8/servlet/exploits/headers.html#page-title


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接