允许网页在HTML框架内渲染

15

我有两个Web应用程序:一个是Web应用程序(web-app),另一个是报表Web。我想在<iframe>中嵌入报表Web,但是浏览器显示以下错误:

 

X-Frame-Options: DENY

是否有任何帮助?

3个回答

19

X-Frame-Options的值可以为DENY(默认),SAMEORIGIN和ALLOW-FROM uri。根据Spring Security文档,您可以告诉Spring添加自定义头来覆盖默认行为:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .headers()
            .addHeaderWriter(new XFrameOptionsHeaderWriter(new WhiteListedAllowFromStrategy(Arrays.asList("www.yourhostname.com"))))
    ...
}

春天将添加X-Frame-Options: ALLOW-FROM ... 或者

 .addHeaderWriter(new XFrameOptionsHeaderWriter(XFrameOptionsHeaderWriter.XFrameOptionsMode.SAMEORIGIN))

对于X-Frame-Options:SAMEORIGIN,或者可以通过完全禁用来关闭它

http.headers().frameOptions().disable()

我需要在哪里添加这个? - R.Anandan
在您的Spring Security配置中,例如如http://docs.spring.io/spring-security/site/docs/4.2.x/guides/html5/所述(如果您正在引用v.4.2.x) - m c

9

编辑(2020年6月)- X-Frame选项已过时:

"frame-ancestors指令取代了X-Frame-Options头文件。如果一个资源同时具有这两个策略,应该执行frame-ancestors策略并忽略X-Frame-Options策略。"
https://www.w3.org/TR/CSP2/#frame-ancestors-and-frame-options

所以请考虑使用content-security-policy

<headers>
    <content-security-policy policy-directives="frame-ancestors 'self'"/>
</headers>

如果你使用的是Spring Security 4.x,以下配置将解决你的问题(假设web应用程序在同一服务器地址上运行)。 XML配置:
<http>
    <!-- ... -->

    <headers>
        <frame-options policy="SAMEORIGIN" />
    </headers>
</http>

Java配置:

@EnableWebSecurity
public class WebSecurityConfig extends
WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
        // ...
        .headers().frameOptions().sameOrigin();
    }
}

禁用配置

您也可以直接禁用它,但要意识到安全风险

http.headers().frameOptions().disable();


背景信息

在Spring Security 3.2.0中引入了安全 Headers,但默认情况下被禁用:
http://spring.io/blog/2013/08/23/spring-security-3-2-0-rc1-highlights-security-headers/

在Spring Security 4.x中,默认启用这些头部(对于IFrames:X-Frame-Options: DENY): "Spring Security 4.x已更改Java配置和XML配置以要求明确禁用默认设置。"
http://docs.spring.io/spring-security/site/migrate/current/3-to-4/html5/migrate-3-to-4-jc.html#m3to4-header

来源:http://docs.spring.io/autorepo/docs/spring-security/4.0.x/reference/html/headers.html#headers-frame-options


不,你的Java代码清单无法编译(即使文档说可以)。 - Erica Kane
你需要删除 "//..." 部分,因为这不是 Java 语法,它代表了之前的 HttpSecurity http 对象的配置。 - flavio.donze
我已经尝试了所有方法,但都无法解决问题。文档中有一些错误,特别是在Java配置标头方面。@medveshonok117给出了正确的答案。 - Erica Kane
出了什么问题?你遇到编译错误了吗?configure()配置没有被调用? - flavio.donze
如果您需要配置多个标题选项,则会出现问题。虽然文档中没有给出任何示例,但我最终还是弄明白了。在大多数情况下,您需要连续使用多个.and()的副本。 - Erica Kane

0

你可以使用

<headers>
  <frame-options policy="SAMEORIGIN"/>
</headers>

在您的安全应用程序上下文XML中的<http>配置内部


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接