ruby rails 允许使用 frame_ancestors 内容安全策略或 X-Frame-Options 将您的网站嵌入其他网站

ruby on rails allow embedding of your website in other sites using frame_ancestors content security policy or X-Frame-Options

我正在尝试允许其他人在许多网站上嵌入我的 rails 应用程序中的页面。我可以使用 X-Frame-Options 让它在 Chrome 和 Firefox 中工作。是否有等效的内容安全策略 response.headers['X-Frame-Options'] = "ALLOW-FROM *"

这是使用 X-Frame-Options 的位

class PeopleController < ApplicationController
  def embed
    response.headers['X-Frame-Options'] = "ALLOW-FROM *"
    @company = People.new
  end
end

但是在 Chrome 和 Google 中都使用内容安全策略时不起作用,当我使用内容安全策略时

class PeopleController < ApplicationController

  content_security_policy do |p|
    p.frame_ancestors "self", "*"
  end

  def embed
    @company = People.new
  end
end

使用内容安全策略时,抛出此错误:

Refused to frame 'http://localhost:3000/' because an ancestor violates the following Content Security Policy directive: "frame-ancestors self".

这是嵌入代码的示例:

  <iframe src="http://localhost:3000/people/embed"></iframe>

这是我试过的另一个:

  <iframe src="/people/embed"></iframe>

更新

使用内容安全策略,这仅适用于 Firefox:

content_security_policy do |p|
  p.frame_ancestors 'self', "*"
end

现代 Chrome 和 Firefox 不支持 X-Frame-Options header 中的 ALLOW-FROM 键。您可以发布 X-Frame-Options: ALLOW-FROM ###X-Frame-Options: ALLOW-FROM http://example.com - 它们没有任何限制,带有 ALLOW-FROM 键的 header 会被浏览器忽略。

如果您希望允许无限域的 iframing,根本不发布 X-Frame-Options header(和 frame-ancestors 指令)会更容易。

如果您有一组计数的允许域,您可以将 CSP header 与 frame-ancestors domain1 domain2 ... domainN;.

一起使用

When using Content Security Policy, it throws this error: ... because an ancestor violates the following Content Security Policy directive: "frame-ancestors self"

此错误表示您确实发布了 frame-ancestors 'self',而不是预期的 frame-ancestors 'self' *
也许你同时发布了两个不同的 CSP header,也许你的代码有错误。您可以 check 您在浏览器中实际获得的 CSP header。

注释 1'self' 标记应为 single-quoted - 在代码中使用 "'self'" 字符串。

注意 2'self' 令牌通常只覆盖标准端口 80/443,不覆盖 http://localhost:3000(它取决于浏览器)。星号 * 涵盖任何端口号。