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
(它取决于浏览器)。星号 *
涵盖任何端口号。
我正在尝试允许其他人在许多网站上嵌入我的 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
(它取决于浏览器)。星号 *
涵盖任何端口号。