首页 > 解决方案 > .headers().frameOptions().disable() 是如何工作的?

问题描述

即将Spring Security允许、控制和访问h2Web 控制台

我读了这两个帖子:

总之,强制使用以下内容(以某种方式“改进”):

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .mvcMatchers("/admin/**").hasRole("ADMIN")
            ...
            .mvcMatchers("/h2-console/**").hasRole("ADMIN")
            .and()
        .csrf().ignoringAntMatchers("/h2-console/**")
            .and()
        .headers().frameOptions().disable()
            .and()

出于安全原因,从上面更好地使用它.csrf().ignoringAntMatchers("/h2-console/**")而不是csrf().disable()它,因为禁用点仅适用于/h2-console/,后者是全局的,不推荐使用。

直到这里我都很好。一旦登录过程发生并且用户具有所需的角色,我就可以看到 H2 Web 控制台。

在此处输入图像描述

现在是强制使用.headers().frameOptions().disable(),如果不使用会发生以下情况:

在此处输入图像描述

当鼠标光标悬停在任何内部块上时,该localhost refused to connect消息会出现在任何内部块上

我的疑问是:

  1. 如何.headers().frameOptions().disable()工作?
  2. 将这句话用于生产环境是否安全?考虑 和 之间的区别 .csrf().ignoringAntMatchers("/h2-console/**")csrf().disable()前者是特定的,后者是“全局的”(不推荐)。因此,可能会有一个特定的配置比.headers().frameOptions().disable()(乍一看对我来说是一个“全局”配置)更好地适用于/h2-console/
  3. 是否.headers().frameOptions().disable()会对其他configure(HttpSecurity http)配置产生直接或间接的负面影响?(主要用于生产)

标签: spring-securityh2

解决方案


首先,让我们看一下X-Frame-Options响应标头。
此标头可用于指示是否应允许浏览器以<frame>或呈现页面<iframe>
网站可以使用它来避免点击劫持攻击,方法是确保其内容不会嵌入到其他网站中。

Spring Security 默认将 X-Frame-Options 响应头DENY设置为。
这告诉浏览器该页面不能显示在框架中,无论站点是否尝试这样做。
由于 H2 控制台 UI 使用<frame>元素,因此不会呈现这些元素,您将看到您在问题中共享的错误屏幕。

Spring Security 允许您.headers().frameOptions()在 Security DSL 中使用自定义此行为。
如果您选择通过设置禁用 X-Frame-Options 标头(不推荐) .headers().frameOptions().disable(),则 Spring Security 不会将 X-Frame-Options 标头添加到响应中。
这意味着您的应用程序可以在一个框架中呈现,也可能容易受到 Clickjacking 攻击

SAMEORIGIN对于这个用例,将 X-Frame-Options 设置为 就足够了,而不是禁用它。

http
    .headers(headers -> headers
        .frameOptions(frameOptions -> frameOptions
            .sameOrigin()
        )
    )

这告诉浏览器页面只能显示在与页面本身同源的框架中。

由于 H2 控制台 UI 中的框架(例如http://localhost:8080/h2-console/tables.do)与 H2 控制台 ( ) 位于同一来源http://localhost:8080/h2-console,因此浏览器将允许显示它们。

但是,如果一个不同的(可能是恶意的)网站试图嵌入一个页面,浏览器将不允许它。


推荐阅读