启用子域 iframe 访问

enable subdomain iframe access

我正在尝试在 y.example.com

托管的网页上显示来自 x.example.com 的 iframe

这是我为

所做的设置

Tomcat:

<filter>
    <filter-name>ClickJackFilterEnabled</filter-name>
    <filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class>
    <init-param>
        <param-name>antiClickJackingEnabled</param-name>
        <param-value>false</param-value>
    </init-param>
</filter>

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

Spring 安全性:

    httpResponse.setHeader("Content-Security-Policy", "default-src 'self' *.example.com; style-src 'self' *.googleapis.com *.amazonaws.com 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; child-src 'self' *.example.com; font-src *;img-src 'self' *.amazonaws.com");
    httpResponse.setHeader("Access-Control-Allow-Origin", "http://*.example.com");

当我打开带有嵌入式 ifram 的页面时,我仍然收到此错误:

Refused to display 'http://x.example.com/' in a frame because it set 'X-Frame-Options' to 'SAMEORIGIN'.

Uncaught SecurityError: Sandbox access violation: Blocked a frame at "http://y.example.com" from accessing a frame at "http://x.example.com".  The frame being accessed is sandboxed and lacks the "allow-same-origin" flag.

当我使用 curl 检查 headers 时,header X-Frame-Options 不存在

这是 curl 的输出

* Rebuilt URL to: y.example.com/
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
   0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0*   Trying 127.0.0.1...
* Connected to y.example.com (127.0.0.1) port 80 (#0)
> GET / HTTP/1.1
> Host: y.example.com
> User-Agent: curl/7.47.0
> Accept: */*
> 
< HTTP/1.1 200 OK
< Server: Apache-Coyote/1.1
< X-Content-Type-Options: nosniff
< X-XSS-Protection: 1; mode=block
< Cache-Control: no-cache, no-store, max-age=0, must-revalidate
< Pragma: no-cache
< Expires: 0
< X-Application-Context: application:dev:8080
< Content-Security-Policy: default-src 'self' *.example.com; style-src 'self' *.googleapis.com *.amazonaws.com 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; child-src 'self' *.example.com; font-src *;img-src 'self' *.amazonaws.com
< Access-Control-Allow-Origin: http://*.example.com
< Content-Type: text/html;charset=UTF-8
< Content-Language: en-IN
< Transfer-Encoding: chunked
< Date: Wed, 20 Jul 2016 13:21:57 GMT
< 
{ [8200 bytes data]

我错过了什么?

更新:

我试过设置

document.domain = "example.com"

在两个网页上,我仍然收到错误

Refused to display 'http://x.example.com/' in a frame because it set 'X-Frame-Options' to 'SAMEORIGIN'

当我打字时

document.domain

在 javascript 控制台中,我得到

"example.com"

在两个网页上。所以两个页面的来源相同。

x.example.com 是发送 SAMEORIGIN header 的人。 y.example.com 无法覆盖它,因为那样就无法阻止 iframe 包含。一个站点必须向其他站点授予权限(由于缺少来源政策或具有权限的站点列表)以包含其内容。

检查来自 x.example.com 的 header,您应该会看到该策略实际上阻止了 iframe。

终于解决了这个问题。问题可能出在浏览器如何处理 X-Frame-Options header.

设置背后的概念

document.domain = "example.com" 

是为了使两个网页的来源相同。浏览器允许将 origin 设置为 parent 域,因此位于 a.x.example.com 的页面可以设置 document.domain[=33= 的值] 至 x.example.comexample.com

现在,即使在将 document.domain 设置为 example.com 之后,我仍然收到错误消息

Refused to display 'http://x.example.com/' in a frame because it set 'X-Frame-Options' to 'SAMEORIGIN'

当我完全删除 X-Frame-Options header 时,使用

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

在 securityConfiguration.java 中,成功了!

我不知道浏览器不支持 document.domain 设置的原因。在 mozilla 文档或其他任何地方找不到任何关于此的内容。希望这对某人有所帮助。