如何通过iframe将我的rails应用程序嵌入到另一个网站?
它与RoR 3很好地配合,但不适用于RoR 4:
<iframe src="http://myrailsapp.com/" width="100%" height="50" id="rails_iframe">error!</iframe>
我尝试在我的控制器中使用verify_authenticity_token
和protect_from_forgery
选项...似乎是别的(但我不确定)。
UPD。例: http://jsfiddle.net/zP329/
答案 0 :(得分:100)
这与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'
}
答案 1 :(得分:47)
Rails 4
added默认X-Frame-Options
HTTP标头值SAMEORIGIN
。这对安全性有好处,但当您做希望在action
中调用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
当您需要在action
中使用多个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
答案 2 :(得分:0)
我正在使用Rails 6和Chromium76。以前的X-Frame-Options解决方案不起作用。但是我注意到,当我们将在线iframe与JS附加在一起时,它的效果很好。因此,我认为这个解决方案很简单:
<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
})
答案 3 :(得分:0)
更新:似乎 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 中显示内容的唯一方法。但如果有人知道我不知道的任何知识,我很乐意得到证明。