61

如何通过 iframe 将我的 rails 应用程序嵌入到另一个网站?

它适用于 RoR 3,但不适用于 RoR 4:

<iframe src="http://myrailsapp.com/" width="100%" height="50" id="rails_iframe">error!</iframe>

我试图在我的控制器中使用verify_authenticity_tokenprotect_from_forgery选项......似乎是别的东西(但我不确定)。

更新。示例:http: //jsfiddle.net/zP329/

4

4 回答 4

104

这与 Rails 4 默认启用额外的安全协议有关:http ://weblog.rubyonrails.org/2013/2/25/Rails-4-0-beta1/

在远程站点上破坏 iFrame 的设置是 X-Frame-Options。默认情况下,这设置为 SAMEORIGIN,这会阻止内容跨域加载:

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

您可以在此处阅读新的默认标头:http: //edgeguides.rubyonrails.org/security.html#default-headers

为了允许 iFrame 跨域工作,您可以更改默认标头以允许 X-Frame 跨域。

config.action_dispatch.default_headers = {
    'X-Frame-Options' => 'ALLOWALL'
}
于 2013-05-18T04:41:02.207 回答
53

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:54:59.597 回答
2

更新:似乎 ALLOW-FROM 和 ALLOWALL 当前都是无效的“X-Frame-Options”标头值。仅有的两个有效的是 DENY 和 SAMEORIGIN,它们都不允许从另一个来源访问。请参阅 MDN 文档:https ://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options 。

所以看起来response.headers.delete "X-Frame-Options"是现在启用在另一个站点上的 iframe 中显示内容的唯一方法。但如果有人有我不知道的任何知识,我很乐意被证明不是这样。

于 2021-06-17T12:39:09.297 回答
0

我正在使用 Rails 6 和 Chromium 76。以前使用 X-Frame-Options 的解决方案不起作用。但是我注意到,当我们使用 JS 附加在线 iframe 时,它​​的效果非常好。所以,我只是在我看来这个简单的解决方案:

<div id='iframe_wrapper' 'data-iframe-content'='<iframe src="https://host.com/"></iframe>'>
</div>

...并添加这样的 JS 代码:

$(document).ready(function() {
  var wrapper = $('#iframe_wrapper')[0]
  wrapper.innerHTML = wrapper.attributes['data-iframe-content'].value
})
于 2019-10-01T12:20:04.650 回答