spring-security - .headers().frameOptions().disable() 是如何工作的?
问题描述
即将Spring Security
允许、控制和访问h2
Web 控制台
我读了这两个帖子:
总之,强制使用以下内容(以某种方式“改进”):
@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
消息会出现在任何内部块上
我的疑问是:
- 如何
.headers().frameOptions().disable()
工作? - 将这句话用于生产环境是否安全?考虑 和 之间的区别
.csrf().ignoringAntMatchers("/h2-console/**")
,csrf().disable()
前者是特定的,后者是“全局的”(不推荐)。因此,可能会有一个特定的配置比.headers().frameOptions().disable()
(乍一看对我来说是一个“全局”配置)更好地适用于/h2-console/
- 是否
.headers().frameOptions().disable()
会对其他configure(HttpSecurity http)
配置产生直接或间接的负面影响?(主要用于生产)
解决方案
首先,让我们看一下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
,因此浏览器将允许显示它们。
但是,如果一个不同的(可能是恶意的)网站试图嵌入一个页面,浏览器将不允许它。
推荐阅读
- android - 如何使用 DatePicker 编辑我的日期?
- plunker - Plunker 文本扩展
- c++ - 链表 - 按值搜索节点
- mysql - 不正确的整数值:“ProductSubcategoryKey”列的“”
- delphi - TabControl - 如何强制事件 OnGetImageIndex
- javascript - 我想根据配置数组生成字符串
- java - 如何将此 SQL 查询转换为 JPA
- javascript - 尝试使用具有功能的 JS 打开一个新选项卡
- c - 删除 C 中的尾随空格
- angular - 组合一个 Observable
和一个数组 > 变成单个 Observable<{string, string[]}>