我如何设置x帧选项响应头允许从值(s)使用spring java配置



我如何设置X-Frame-Options响应头与允许的值使用spring java配置?

http.headers().disable()
    .addHeaderWriter(new XFrameOptionsHeaderWriter(
      new WhiteListedAllowFromStrategy(
        Arrays.asList("https://example1.com", "https://example2.com"))));

在Http响应头中,我得到:

X-Frame-Options:"ALLOW-FROM否认"。

为什么我的起源不在标题值中列出?

我最终像下面这样静态地添加了我的标题:

http
    .headers().frameOptions().disable()
    .addHeaderWriter(new StaticHeadersWriter("X-FRAME-OPTIONS", "ALLOW-FROM example1.com"));
//disable 默认策略。 这一句不能省。 
http.headers().frameOptions().disable();
//新增新的策略。 
http.headers().addHeaderWriter(new XFrameOptionsHeaderWriter(
            new WhiteListedAllowFromStrategy(
                    Arrays.asList("http://itaobops.aliexpress.com", 
"https://cpp.alibaba-inc.com",
                            "https://pre-cpp.alibaba-inc.com"))));

您可以使用X-Content-Security-Policy和Content-Security-Policy来代替X-Frame-Options,它们提供了更大的灵活性,允许iframe使用通配符访问多个域。

下面是一个例子-

http.csrf().disable()
.headers().addHeaderWriter(new StaticHeadersWriter(
        "X-Content-Security-Policy",
        "frame-ancestors self *.domain1.com *.domain2.com"))
.and()
.headers().addHeaderWriter(new StaticHeadersWriter(
        "Content-Security-Policy",
        "frame-ancestors self *.domain1.com *.domain2.com"))
X-Frame-Options值将被丢弃。

我正在寻找相同的,没有找到答案。不管我怎么配置它,头总是不正确的。

我的解决方法是从Spring框架doc

中使用委派头写入器。

因此,我构建了一个逻辑来始终设置SAMEORIGIN,不包括一些白名单:

new DelegatingRequestMatcherHeaderWriter(
            new NegatedRequestMatcher(
                    new OrRequestMatcher(
                            whiteLists
                    )
            ),
            new XFrameOptionsHeaderWriter(XFrameOptionsMode.SAMEORIGIN);

背后的逻辑:如果白名单中有匹配的,那么不要添加头,否则添加带有SAMEORIGIN值的头。

我认为这是值得考虑的,因为不是所有的浏览器都支持ALLOW-FROM。

下面是Spring Boot 2.3中为我工作的安全配置代码片段:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .headers()
            .frameOptions()
            .disable()
            .addHeaderWriter(new XFrameOptionsHeaderWriter(new StaticAllowFromStrategy(URI.create("example.com"))))
...

您可以允许多个url如下,但我不知道这是否是正确的方式,仍然,它工作正常。

public void configure(HttpSecurity httpSecurity) throws Exception {
    httpSecurity.csrf().disable().authorizeRequests().anyRequest().permitAll()
                .and()
                .headers().defaultsDisabled()
                .and()
                .cors()
                .and()
                .headers()
                .cacheControl()
                .and()
                .contentTypeOptions()
                .and()
                .httpStrictTransportSecurity().disable()
                .and()
                .headers()
                .frameOptions().disable()
                .addHeaderWriter(new StaticHeadersWriter("X-FRAME-OPTIONS",
                    "ALLOW-FROM example1.com",
                    "ALLOW-FROM example2.com",
                    "ALLOW-FROM example3.com",
                    "ALLOW-FROM example4.com",
                    "ALLOW-FROM example5.com"));
}

最新更新