我正在写一个小网页,它的目的是框架其他一些页面,只是为了将它们合并到一个浏览器窗口中,以便于查看。一些页面,我试图框架禁止被框架,并抛出“拒绝显示文档,因为显示禁止X-Frame-Options.”错误在Chrome。我知道这是一个安全限制(有充分的理由),并且无法更改它。
是否有任何替代的框架或非框架方法来在单个窗口中显示页面,而不会被X-Frame-Options报头绊倒?
我正在写一个小网页,它的目的是框架其他一些页面,只是为了将它们合并到一个浏览器窗口中,以便于查看。一些页面,我试图框架禁止被框架,并抛出“拒绝显示文档,因为显示禁止X-Frame-Options.”错误在Chrome。我知道这是一个安全限制(有充分的理由),并且无法更改它。
是否有任何替代的框架或非框架方法来在单个窗口中显示页面,而不会被X-Frame-Options报头绊倒?
当前回答
唯一真正的答案,如果你不控制你想在iframe中的源的头,就是代理它。让服务器充当客户端,接收源,去除有问题的头,如果需要添加CORS,然后ping您自己的服务器。
还有一个解释如何编写这样一个代理的答案。这并不难,但我相信以前一定有人这么做过。只是因为某些原因,很难找到它。
我终于找到了一些资料来源:
https://github.com/Rob--W/cors-anywhere/#documentation
^者优先。如果你需要很少使用,我认为你可以使用他的heroku应用程序。否则,这是在你自己的服务器上运行它的代码。注意限制是什么。
whateverorigin.org
^第二选择,但相当古老。应该是python中的新选择:https://github.com/Eiledon/alloworigin
还有第三种选择:
http://anyorigin.com/
这似乎允许一些免费使用,但如果你不付钱,使用一些不确定的数量,你就会被列入公众的耻辱名单,只有在你付钱的情况下,你才能被删除……
其他回答
唯一一个有一堆答案的问题。欢迎来到这个指南,我希望我在最后期限那天晚上10:30为它工作时能有这个指南……facebook在canvas应用上做了一些奇怪的事情,好吧,你已经被警告过了。如果你还在这里,你有一个Rails应用程序将出现在Facebook Canvas后面,那么你将需要:
Gemfile:
gem "rack-facebook-signed-request", :git => 'git://github.com/cmer/rack-facebook-signed-request.git'
配置/ facebook.yml
facebook:
key: "123123123123"
secret: "123123123123123123secret12312"
配置/ application.rb
config.middleware.use Rack::Facebook::SignedRequest, app_id: "123123123123", secret: "123123123123123123secret12312", inject_facebook: false
配置/初始化/ omniauth.rb
OmniAuth.config.logger = Rails.logger
SERVICES = YAML.load(File.open("#{::Rails.root}/config/oauth.yml").read)
Rails.application.config.middleware.use OmniAuth::Builder do
provider :facebook, SERVICES['facebook']['key'], SERVICES['facebook']['secret'], iframe: true
end
application_controller.rb
before_filter :add_xframe
def add_xframe
headers['X-Frame-Options'] = 'GOFORIT'
end
你需要一个控制器来调用Facebook的画布设置,我使用/canvas/,并使路由到这个应用程序的主SiteController:
class SiteController < ApplicationController
def index
@user = User.new
end
def canvas
redirect_to '/auth/failure' if request.params['error'] == 'access_denied'
url = params['code'] ? "/auth/facebook?signed_request=#{params['signed_request']}&state=canvas" : "/login"
redirect_to url
end
def login
end
end
login.html.erb
<% content_for :javascript do %>
var oauth_url = 'https://www.facebook.com/dialog/oauth/';
oauth_url += '?client_id=471466299609256';
oauth_url += '&redirect_uri=' + encodeURIComponent('https://apps.facebook.com/wellbeingtracker/');
oauth_url += '&scope=email,status_update,publish_stream';
console.log(oauth_url);
top.location.href = oauth_url;
<% end %>
来源
配置我认为来自omniauth的例子。 宝石文件(这是关键!!)来自:slideshare things i learned… 这个堆栈问题有整个Xframe的角度,所以你会得到一个空白,如果 你不需要把这个头文件放到应用控制器中。 我的男人@rafmagana写了这个heroku指南,现在你可以用这个答案来做轨道,也可以用巨人的肩膀走路。
我几乎尝试了所有的建议。然而,唯一真正解决这个问题的是:
在PHP文件所在的文件夹中创建一个.htaccess文件。 将这一行添加到htaccess: 报头总是不设置x帧选项
通过来自另一个域的iframe嵌入PHP之后应该可以工作。
此外,你可以在你的PHP文件的开头添加:
header('X-Frame-Options: ALLOW');
然而,在我的情况下,这是不必要的。
使用下面给出的这一行,而不是header()函数。
echo "<script>window.top.location = 'https://apps.facebook.com/yourappnamespace/';</script>";
网站所有者使用X-Frame-Options响应报头,这样他们的网站就不能在Iframe中打开。这有助于保护用户免受点击劫持攻击
如果你想在自己的机器上禁用X-Frame-Options,可以尝试几种方法。
服务器端配置
如果您拥有服务器或可以与站点所有者合作,那么您可以要求设置一个配置,以根据某些条件不发送Iframe buster响应标头。条件可以是额外的请求头或URL中的参数。
例如,站点所有者可以添加一个额外的代码,当站点打开时不发送Iframe buster报头,使用?in_debug_mode=true查询参数。
使用浏览器扩展,如Requestly删除响应头
您可以使用任何浏览器扩展,如Requestly,它允许您修改请求和响应头。这里有一个Requestly博客,解释了如何在Iframe中嵌入站点,绕过Iframe buster头。
配置一个直通代理,并从它删除标题
如果你需要为多人绕过Iframe buster报头,那么你也可以配置一个直通代理,它只删除帧buster响应报头并返回响应。然而,这是一个非常复杂的编写和设置。还有一些其他的挑战,比如通过代理在Iframe中打开的站点的身份验证等,但这种方法可以很好地用于简单的站点。
PS -我已经建立了这两个解决方案,并有第一手的经验。
我不确定这有什么关系,但我想出了一个变通办法。在我的网站上,我想在一个包含加载URL的iframe的模态窗口中显示链接。
我所做的是,我将链接的点击事件链接到这个javascript函数。所有这些操作都是向一个PHP文件发出请求,该文件在决定是在模式窗口中加载URL还是重定向之前,检查URL头中的X-FRAME-Options。
函数如下:
function opentheater(link, title){
$.get( "url_origin_helper.php?url="+encodeURIComponent(link), function( data ) {
if(data == "ya"){
$(".modal-title").html("<h3 style='color:480060;'>"+title+" <small>"+link+"</small></h3>");
$("#linkcontent").attr("src", link);
$("#myModal").modal("show");
}
else{
window.location.href = link;
//alert(data);
}
});
}
下面是检查它的PHP文件代码:
<?php
$url = rawurldecode($_REQUEST['url']);
$header = get_headers($url, 1);
if(array_key_exists("X-Frame-Options", $header)){
echo "nein";
}
else{
echo "ya";
}
?>
希望这能有所帮助。