Spring Security 项目的 'X-Frame-Options' to 'deny' 错误

有一个项目启用了 Spring Security,后台使用的是 H2 数据库。

使用用户名和密码登录后没有问题,但登录后提示 ‘X-Frame-Options’ to ‘deny’. 错误。

错误信息如上图。

问题和解决

X-Frame-Options HTTP 响应头是用来给浏览器指示允许一个页面可否在 <frame>、<iframe>、<embed> 或者 <object> 中展现的标记。站点可以通过确保网站没有被嵌入到别人的站点里面,从而避免点击劫持 攻击。

X-Frame-Options有三种可配置值

  • X-Frame-Options: DENY
  • X-Frame-Options: SAMEORIGIN
  • X-Frame-Options: ALLOW-FROM https://example.com/

第一个例子告诉浏览器不要(DENY)把这个网页放在iFrame内,通常的目的就是要帮助用户对抗点击劫持。

第二个例子告诉浏览器只有当架设iFrame的网站与发出X-Frame-Options的网站相同,才能显示发出X-Frame-Options网页的内容。

第三个例子告诉浏览器这个网页只能放在 https://example.com/ 网页架设的iFrame内。

不指定X-Frame-Options的网页等同表示它可以放在任何iFrame内。

X-Frame-Options可以保障你的网页不会被放在恶意网站设定的iFrame内,令用户成为点击劫持的受害人。

Clickjacking

如上图所展示的内容,受害者通常是因为点击了来路不明的网页,在这个网页中通常有一个 IFrame 嵌入。

然后攻击者就可以利用这个漏洞来对用户的点击进行劫持。

Spring Security 的启用

在 Spring 中,我们可以使用下面的代码来进行同源性校验。

http.headers().frameOptions().sameOrigin();

当然,更可以直接禁用这个校验。

针对我们的问题,使用同源性校验就可以满足要求了。