46

我正在尝试测试响应式设计。我正在使用 Rails 4。我知道它将“X-Frame-Options”设置为 SAME ORIGIN。所以我在 development.rb 中使用

config.action_dispatch.default_headers = {
    'X-Frame-Options' => 'ALLOWALL'
  }

它奏效了。我在 Chrome 控制台中查看了网络请求,如下所示:

在此处输入图像描述

但是像 responsive.is 和 responsinator.com 这样的网站仍然给我以下错误:

Refused to display 'http://localhost:3000/' in a frame because it set 'X-Frame-Options' to 'SAMEORIGIN'. about:blank:1

这是怎么回事??

4

8 回答 8

72

尝试删除此标头“X-Frame-Options”。也许在控制器中这样:

before_filter :allow_iframe_requests
...
def allow_iframe_requests
  response.headers.delete('X-Frame-Options')
end
于 2013-07-25T15:28:14.093 回答
28

我和你有同样的问题,并且整晚都在寻找解决这个问题的方法。

我终于知道为什么会这样了。这是因为 Chrome 缓存。

您可以看到header['X-Frame-Options']ALLOWALL,但它不起作用。

只需尝试打开“新隐身窗口”并转到同一页面即可!

在我的测试中,这个问题只发生在开发模式下。它在生产模式下运行良好。

于 2013-08-15T02:13:45.670 回答
25

Rails 4 添加了默认的X-Frame-OptionsHTTP 标头值SAMEORIGIN. 这对安全性有好处,但是当您确实希望action在 an 中调用iframe您时,可以这样做:


允许所有来源:

class MyController < ApplicationController
  def iframe_action
    response.headers.delete "X-Frame-Options"
    render_something
  end
end

允许特定来源:

class MyController < ApplicationController
  def iframe_action
    response.headers["X-FRAME-OPTIONS"] = "ALLOW-FROM http://some-origin.com"
    render_something
  end
end

使用 :after_filter

当您需要使用多个actionin 时iframe,最好创建一个方法并使用以下方法调用它:after_filter

class ApplicationController < ActionController::Base

  private
  def allow_iframe
    response.headers.delete "X-Frame-Options"
  end
end

在您的控制器中使用它,如下所示:

class MyController < ApplicationController
  after_filter :allow_iframe, only: [:basic_embed, :awesome_embed]

  def basic_embed
      render_something
  end

  def awesome_embed
      render_something
  end

  # Other Actions...
end

在浏览器中执行硬刷新,或使用其他浏览器查看更改

通过:Rails 4:让特定动作嵌入为 iframe

于 2015-03-11T05:56:25.703 回答
9

当“加载被 X-Frame-Options 拒绝”使用 Heroku 和 Firefox

我有一个类似的问题,我在 Firefox 上不断收到此错误。我有一个托管在@MochaHostPHP的网页,为托管在@HerokuRails应用提供服务(因此,RoR 应用有一个指向该网页的页面,并且该页面适用于除 Firefox 之外的所有浏览器)。iframePHP

我能够通过在特定环境文件中为我的所有请求设置默认标头来解决问题:

# config/enviroments/production.rb

config.action_dispatch.default_headers = { 'X-Frame-Options' => 'ALLOWALL' }

编辑 (如sheharyar建议)

理想情况下,您不应设置默认标头,并且仅对必须在 iFrame 中呈现的操作执行此操作。如果您的整个应用程序都在 iFrame 中提供,您应该明确提及Origin

# config/enviroments/production.rb

config.action_dispatch.default_headers = { 'X-Frame-Options' => 'ALLOW-FROM http://some-origin.com' }
于 2015-04-23T00:25:47.460 回答
1

试试ALLOW-FROM http://example.com?如果您拥有足够新的 Chrome [2] 版本,则在 Chrome 中 ALLOWALL 可能没问题

[1] https://developer.mozilla.org/en-US/docs/HTTP/X-Frame-Options

[2] https://stackoverflow.com/a/16101968/800526

于 2013-07-20T13:12:45.613 回答
0

我找到了另一个原因。假设实施了 ALLOWALL 或类似的修复,下一个问题是尝试在 https 网站中使用 http 内容,这会导致安全风险,并被 mozilla、IE 和可能的其他浏览器阻止。我花了 6 个小时才确定这一点,希望通过分享我可以减轻别人的痛苦......

可以通过以下方式检查:

  • 使用应该显示错误的浏览器网络工具。
  • 网络日志将与您的供应站点没有任何联系。
  • 用银行 https 主页替换您的内容 url 应该证明 iframe 可以正常工作。

解决方案是询问来源是否有 https 内容或寻找其他供应商。

参考:

于 2015-09-21T21:09:36.393 回答
0

我只是想在这里给出一个关于在 iframe 中嵌入 Rails 应用程序的更新答案。

简单地删除 X-Frame-Options 标头而不强制执行某种其他类型的安全措施来防止 Clickjacking(这是 X-Frame-Options 主要试图保护您免受攻击的漏洞),这不是一个好主意。

问题是大多数主流浏览器不再接受 X-Frame-Options 'ALLOW-FROM' 选项。

截至 2020 年 5 月 28 日撰写本文时,防止点击劫持和在 iframe 中托管应用的最佳解决方案是实施 Content-Security-Policy 并设置“frame_ancestors”策略。'frame_ancestors' 键指定哪些域可以将您的应用程序嵌入为 iframe。它目前受主要浏览器支持并覆盖您的 X-Frame-Options。

您可以在初始化程序(下面的示例)中使用 Rails 5.2 设置 Content-Security-Policy,对于 Rails < 5.2,您可以使用像 Secure Headers gem 这样的 gem:https ://github.com/github/secure_headers

如果您愿意,您还可以基于控制器/操作覆盖策略规范。

内容安全策略非常适合高级安全保护。查看您可以在 Rails 文档中配置的所有内容:https ://edgeguides.rubyonrails.org/security.html

内容安全策略的 Rails 5.2 示例:

# config/initializers/content_security_policy.rb    
Rails.application.config.content_security_policy do |policy|
  policy.frame_ancestors :self, 'some_website_that_embeds_your_app.com'
end

控制器特定更改策略的示例:

# Override policy inline
class PostsController < ApplicationController
  content_security_policy do |p|
    p.frame_ancestors :self, 'some_other_website_that_can_embed_posts.com'
  end
end
于 2020-05-28T23:09:20.090 回答
-2

如果您希望此更改在所有环境中生效,请将其放在 application.rb 中。

于 2014-12-12T22:36:41.160 回答