Java:“目标服务器没有返回一个X-Frame-Options头”的解决方案

Java:“目标服务器没有返回一个X-Frame-Options头”的解决方案。

前言

在涉及网站安全时遇到一个问题,“目标服务器没有返回一个X-Frame-Options头”,找了网上的帖子,说的都不是太清楚,所以研究总结一下,方便后人。

正文

问题描述

以下摘录一下对于安全网站这个问题的描述和建议解决方案:

概要

目标服务器没有返回一个X-Frame-Options头。

攻击者可以使用一个透明的、不可见的iframe,覆盖在目标网页上,然后诱使用户在该网页上进行操作,此时用户将在不知情的情况下点击透明的iframe页面。通过调整iframe页面的位置,可以诱使用户恰好点击iframe页面的一些功能性按钮上,导致被劫持。

解决方案

修改web服务器配置,添加X-frame-options响应头。赋值有如下三种:

(1)DENY:不能被嵌入到任何iframe或frame中。

(2)SAMEORIGIN:页面只能被本站页面嵌入到iframe或者frame中。

(3)ALLOW-FROM uri:只能被嵌入到指定域名的框架中。

也可在代码中加入,在PHP中加入:

header(‘X-Frame-Options: deny’);

具体实例

但是我们的环境是Java的Springmvc,这个应该怎么解决呢?其实Spring框架中的security本身有对这个问题的解决方案,但是这是之前的Spring框架中的(SSH那会的),现在用了Springmv了,应该怎么去解决这个问题呢?

参考 这里
,这里介绍说配置项目的web.xml文件如下,即可解决问题:

<filter>
    <filter-name>httpHeaderSecurity</filter-name>
    <filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class>
    <init-param>
        <param-name>antiClickJackingOption</param-name>
        <param-value>SAMEORIGIN</param-value>
    </init-param>
    <async-supported>true</async-supported>
</filter>

<filter-mapping>
    <filter-name>httpHeaderSecurity</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

但是又引出一个新的问题:

cvc-complex-type.2.4.a: Invalid content was found starting with element ‘async-supported’. One of ‘{“ http://java.sun.com/xml/ns/javaee":run-as
, “ http://java.sun.com/xml/ns/javaee":security-role-ref}’
is expected.

继续探索,找到 这里
说的:

xmlns中再加两行:

http://www.springmodules.org/schema/cache/springmodules-cache.xsd

http://www.springmodules.org/schema/cache/springmodules-ehcache.xsd

问题才真正得到了解决,但是原因是什么呢?

找到
Tomcat
官网
的讲解:

org.apache.catalina.filters.HttpHeaderSecurityFilter .//过滤器的类名

……

antiClickJackingOption //参数配置,可以设置成DENY(拒绝),SAMEORIGIN(同源),ALLOW-FROM(允许从哪里来的)

What value should be used for the anticlick-jacking header? Must be one of DENY, SAMEORIGIN, ALLOW-FROM (case-insensitive). If not specified, the default value of DENY will be used.

这样,上面配置这个过滤器就搞明白了,那么后面出现的那个问题又是怎么回事呢?

这里要研究一下这段语句的意思:

<web-app version="3.0" 
    xmlns="http://java.sun.com/xml/ns/javaee 

http://www.springmodules.org/schema/cache/springmodules-cache.xsd


http://www.springmodules.org/schema/cache/springmodules-ehcache.xsd"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 

http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

xmlns
xml
namespace
,这个是为了解决多个开发者对于xml的命名会产生冲突的问题。

xmlns:xsi
:定义了 xml
的标准前缀。

xsi:schemaLocation
xml
schema
定义的位置。

简言之, Java
对于 xml
的名值设置了一套定义规则,发布在上面的地方,我们上面使用的这个元素名 async-supported
,在之前的 web.xml
中所定义的位置是没有找到的,所以要改成可以找到这个元素定义的位置。

至此,问题基本搞明白了。

参考

https://www.w3schools.com/xml/schema_intro.asp。

原文 

https://www.oxysun.cn/java/java-springmvc-X-Frame-Options.html

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » Java:“目标服务器没有返回一个X-Frame-Options头”的解决方案

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址