如何在Rails 4控制器中为“X-Frame-Options”允许来自多个域的内容?

16
在我正在处理的 Ruby on Rails 4 应用程序中,我需要创建一个页面,该页面将被拉入托管在 foo.bar.com 服务器上的 iframe 中。因此,我有了这个控制器方法:

在我正在处理的 Ruby on Rails 4 应用程序中,我需要创建一个页面,该页面将被拉入托管在 foo.bar.com 服务器上的 iframe 中。因此,我有了这个控制器方法:

def iframed_page
  response.headers["X-FRAME-OPTIONS"] = "ALLOW-FROM http://foo.bar.com"
end

现在客户要求我也将http://foo.dev.bar.com添加到白名单中。

我知道对于设置X-FRAME-OPTIONS,"ALLOW-FROM"选项不允许多个子域名。但由于这是具有不同子域的相同根域,它是否会更加灵活?例如,我能否做出类似的操作:

response.headers["X-FRAME-OPTIONS"] = "ALLOW-FROM http://*.bar.com"

还有吗?


1
可能是X-Frame-Options Allow-From multiple domains的重复问题。 - deefour
1
我已经阅读了那个问题,非常感谢。它并没有解释关于Ruby on Rails的任何内容,或者如果您有相同根域的两个不同子域该怎么办。 - drumwolf
1
当我说:你的问题并不是真正的Rails特定问题时,我并不是在争论。上面链接的问题/答案确实提供了使用Content-Security-Policy通配符前缀的信息。无论如何,似乎X-FRAME-OPTIONS可能不是最具前瞻性的选择。 - deefour
上面链接的问题明确表明Content-Security-Policy在所有浏览器中都不起作用,相关指令frame-ancestors只在Chrome和Firefox中起作用。此外,该答案关于X-FRAME-OPTIONS的陈述也已过时。 - fzzfzzfzz
1个回答

20

你可以使用 Content-Security-Policy 头部替代,但它在一些情况下不适用

response.headers["X-Content-Security-Policy"] = "frame-ancestors http://*.bar.com";
response.headers["Content-Security-Policy"] = "frame-ancestors http://*.bar.com";
  • 在现代浏览器上,Content-Security-Policy 会覆盖 X-Frame-Options
  • 在IE11上,X-Content-Security-Policy 会覆盖 X-Frame-Options

4
frame-ancestors 是 CSP 版本 2 的一部分,目前在 Internet Explorer 或 Edge 中 不被支持 - Sjoerd
1
请注意,在Firefox浏览器中,frame-ancestors不会优先考虑,请参见此错误https://bugzilla.mozilla.org/show_bug.cgi?id=1024557并点赞以尝试解决此问题。 - MicWit
1
根据https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP的说明:有时您会看到提到X-Content-Security-Policy头的内容,但那是旧版本,您不再需要指定它。 - Madbreaks
注意:已知在某些浏览器版本上同时使用Content-Security-Policy和X-Content-Security-Policy或X-Webkit-CSP会引起意外行为。请避免使用已弃用的X-*头部。- 来源:https://content-security-policy.com/ - Pak

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