.headers().frameOptions().disable() 是如何工作的?

How does .headers().frameOptions().disable() work?

关于 Spring Security 允许、控制和访问 h2 网络控制台

我看了这两个帖子:

总而言之,必须使用以下内容(在某种程度上“有所改进”):

@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) 配置有任何直接或间接的负面影响? (主要用于生产)

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

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

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

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

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

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

由于 H2 控制台 UI 中的帧(例如 http://localhost:8080/h2-console/tables.do)与 H2 控制台(http://localhost:8080/h2-console)具有相同的来源,浏览器将允许它们被显示。

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