克服“x帧选项禁止显示”;

我正在写一个小网页,它的目的是框架其他一些页面,只是为了将它们合并到一个浏览器窗口中,以便于查看。一些页面,我试图框架禁止被框架,并抛出“拒绝显示文档,因为显示禁止X-Frame-Options.”错误在Chrome。我知道这是一个安全限制(有充分的理由),并且无法更改它。

是否有任何替代的框架或非框架方法来在单个窗口中显示页面,而不会被X-Frame-Options报头绊倒?

765710 次浏览

我有一个类似的问题,我试图在一个iframe中显示我们自己网站的内容(作为一个带有Colorbox的灯箱风格的对话框),并且我们在源服务器上有一个服务器范围的“X-Frame-Options SAMEORIGIN”报头,防止它加载到我们的测试服务器上。

这似乎没有被记录在任何地方,但如果你可以编辑你试图iframe的页面(例如。,它们是你自己的页面),简单地发送另一个X-Frame-Options报头,任何字符串都禁用SAMEORIGIN或DENY命令。

如。对于PHP,放入

<?php
header('X-Frame-Options: GOFORIT');
?>

在页面的顶部会使浏览器将两者结合起来,从而导致页眉为

X-Frame-Options SAMEORIGIN, GOFORIT

...并允许您在iframe中加载页面。当初始的SAMEORIGIN命令设置在服务器级别时,这似乎可以工作,并且您希望在逐页情况下重写它。

祝你一切顺利!

如果在试图将谷歌Map嵌入到iframe中时遇到此错误,则需要将&output=embed添加到源链接中。

如果你在YouTube视频中遇到这个错误,不要使用完整的url,而是使用共享选项中的嵌入url。它看起来像http://www.youtube.com/embed/eCfDxZxTBW4

你也可以用embed/替换watch?v=,这样http://www.youtube.com/watch?v=eCfDxZxTBW4就变成了http://www.youtube.com/embed/eCfDxZxTBW4

就其价值而言:

我们遇到了这样的情况,当这个“断路器”代码出现时,我们需要杀死iFrame。因此,在iFrame中显示远程URL之前,我使用PHP function get_headers($url);来检查远程URL。为了获得更好的性能,我将结果缓存到一个文件中,这样就不会每次都建立HTTP连接。

当我尝试在iframe中嵌入moodle 2时,我也有同样的问题,解决方案是Site administration ► Security ► HTTP security并检查Allow frame embedding

添加一个

  target='_top'

到我的链接在facebook标签为我解决了这个问题…

这就是解决办法!!

FB.Event.subscribe('edge.create', function(response) {
window.top.location.href = 'url';
});

这是唯一适用于facebook应用的方法!

我在mediawiki上遇到了同样的问题,这是因为服务器出于安全原因拒绝将页面嵌入到iframe中。

我写了

$wgEditPageFrameOptions = "SAMEORIGIN";

导入mediawiki PHP配置文件。

希望能有所帮助。

如果你在尝试嵌入Vimeo内容时遇到此错误,请将iframe的src,

从:https://vimeo.com/63534746
更改为:http://player.vimeo.com/video/63534746

唯一一个有一堆答案的问题。欢迎来到这个指南,我希望我在最后期限那天晚上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的例子。
  • gem文件(是键!!)来自:用幻灯片分享我学到的东西…
  • 这个堆栈问题有整个Xframe的角度,所以你会得到一个空白,如果 你不把这个头文件放在应用控制器中
  • 我的男人@rafmagana写了这个heroku指南,现在你可以用这个答案作为铁轨,也可以用巨人的肩膀走路。

使用下面给出的这一行,而不是header()函数。

echo "<script>window.top.location = 'https://apps.facebook.com/yourappnamespace/';</script>";

我不确定这有什么关系,但我想出了一个变通办法。在我的网站上,我想在一个包含加载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+"&nbsp;&nbsp;&nbsp;<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";
}




?>

希望这能有所帮助。

<form target="_parent" ... />

根据Kevin Vella的想法,我尝试在PayPal的按钮生成器生成的表单元素上使用上述方法。为我工作,这样贝宝不会在一个新的浏览器窗口/标签打开。

更新

这里有一个例子:

从今天(01-19-2021)开始生成按钮,PayPal自动在form元素上包含target="_top",但如果这对你的上下文不起作用,请尝试不同的target值。我建议_parent——至少当我使用这个PayPal按钮时,它是有效的。

更多信息请参见表格目标值

<form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_parent">
<input type="hidden" name="cmd" value="_xclick">
<input type="hidden" name="business" value="name@email.com">
<input type="hidden" name="lc" value="US">
<input type="hidden" name="button_subtype" value="services">
<input type="hidden" name="no_note" value="0">
<input type="hidden" name="currency_code" value="USD">
<input type="hidden" name="bn" value="PP-BuyNowBF:btn_buynowCC_LG.gif:NonHostedGuest">
<input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_buynowCC_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!">
<img alt="" border="0" src="https://www.paypalobjects.com/en_US/i/scr/pixel.gif" width="1" height="1">
</form>

虽然没有提及,但在某些情况下可以有所帮助:

var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState !== 4) return;
if (xhr.status === 200) {
var doc = iframe.contentWindow.document;
doc.open();
doc.write(xhr.responseText);
doc.close();
}
}
xhr.open('GET', url, true);
xhr.send(null);

我在运行wordpress网站时遇到了这个问题。我尝试了各种各样的东西来修复它,但不确定如何修复,最终的问题是因为我使用了带有屏蔽的DNS转发,并且到外部站点的链接没有被正确地处理。例如,我的网站托管在http://123.456.789/index.html,但被屏蔽在http://somewebSite.com/index.html运行。当我在浏览器中输入http://123.456.789/index.html时,点击这些相同的链接导致JS控制台上没有x帧起源问题,但运行http://somewebSite.com/index.html却有。为了正确地屏蔽你必须添加你的主机的DNS名称服务器到你的域服务,即godaddy.com应该有名称服务器的例子,ns1.digitalocean.com, ns2.digitalocean.com, ns3.digitalocean.com,如果你使用digitalocean.com作为你的托管服务。

有一个Chrome插件,删除头条目(仅供个人使用):

https://chrome.google.com/webstore/detail/ignore-x-frame-headers/gleekbfjekiniecknbkamfmkohkpodhe/reviews < a href = " https://chrome.google.com/webstore/detail/ignore-x-frame-headers/gleekbfjekiniecknbkamfmkohkpodhe/reviews " > < / >

你使用客户端JavaScript和我的< >强X-Frame-Bypass < / >强 Web组件在<iframe>中绕过X-Frame-Options。下面是一个演示:黑客新闻在X-Frame-Bypass。(测试在Chrome &Firefox)。

令人惊讶的是,这里没有人提到Apache服务器的设置(*.conf文件)或.htaccess文件本身是导致此错误的原因。搜索你的.htaccessApache配置文件,确保你没有将以下设置为DENY:

Header always set X-Frame-Options DENY

将其更改为SAMEORIGIN,使事情按预期工作:

Header always set X-Frame-Options SAMEORIGIN

我有这个问题,并解决了它编辑httd.conf

<IfModule headers_module>
<IfVersion >= 2.4.7 >
Header always setifempty X-Frame-Options GOFORIT
</IfVersion>
<IfVersion < 2.4.7 >
Header always merge X-Frame-Options GOFORIT
</IfVersion>
</IfModule>

我把SAMEORIGIN改为GOFORIT 并重新启动服务器

我几乎尝试了所有的建议。然而,唯一真正解决这个问题的是:

  1. 在PHP文件所在的文件夹中创建.htaccess

  2. 将这一行添加到htaccess:

    Header always unset X-Frame-Options < / p >

通过来自另一个域的iframe嵌入PHP之后应该可以工作。

此外,你可以在你的PHP文件的开头添加:

header('X-Frame-Options: ALLOW');

然而,在我的情况下,这是不必要的。

我使用的是Tomcat 8.0.30,没有一个建议对我有效。因为我们正在寻找更新X-Frame-Options并将其设置为ALLOW,下面是我如何配置以允许嵌入iframes:

  • 进入Tomcat conf目录,编辑web.xml文件
  • 添加下面的过滤器:
<filter>
<filter-name>httpHeaderSecurity</filter-name>
<filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class>
<init-param>
<param-name>hstsEnabled</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>antiClickJackingEnabled</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>antiClickJackingOption</param-name>
<param-value>ALLOW-FROM</param-value>
</init-param>
<async-supported>true</async-supported>
</filter>


<filter-mapping>
<filter-name>httpHeaderSecurity</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
  • 重启Tomcat服务
  • 使用iFrame访问资源。

如果使用Content-Security-Policy标头,X-Frame-Options Allow-From https://..。会被贬值并被替换(并被忽略)。

这里是完整的引用:https://content-security-policy.com/

试试这个东西,我认为没有人在主题中建议过这个,这将解决你70%的问题,对于其他一些页面,你必须废弃,我有完整的解决方案,但不是公开的。

添加到下面的iframe中

沙箱="允许-同源允许-脚本允许-弹出窗口允许-表单"

将外部网站加载到iFrame的解决方案,即使外部网站的x帧选项设置为拒绝。

如果你想加载一个其他网站到iFrame中,你得到Display forbidden by X-Frame-Options”错误,那么你实际上可以通过创建一个服务器端代理脚本来克服这个问题。

iFrame的src属性可以有一个这样的url: /proxy.php?url=https://www.example.com/page&key=somekey

那么proxy.php看起来就像这样:

if (isValidRequest()) {
echo file_get_contents($_GET['url']);
}


function isValidRequest() {
return $_SERVER['REQUEST_METHOD'] === 'GET' && isset($_GET['key']) &&
$_GET['key'] === 'somekey';
}

这通过传递块,因为它只是一个GET请求,可能是一个普通的浏览器页面访问。

注意:您可能需要改进此脚本中的安全性。因为黑客可以通过你的代理脚本开始加载网页。

唯一真正的答案,如果你不控制你想在iframe中的源的头,就是代理它。让服务器充当客户端,接收源,去除有问题的头,如果需要添加CORS,然后ping您自己的服务器。

还有一个解释如何编写这样一个代理的答案。这并不难,但我相信以前一定有人这么做过。只是因为某些原因,很难找到它。

我终于找到了一些资料来源:

https://github.com/Rob--W/cors-anywhere/#documentation

^者优先。如果你需要很少使用,我认为你可以使用他的heroku应用程序。否则,这是在你自己的服务器上运行它的代码。注意限制是什么。

whateverorigin.org

^第二选择,但相当古老。应该是python中的新选项:https://github.com/Eiledon/alloworigin

还有第三种选择:

http://anyorigin.com/

这似乎允许一些免费使用,但如果你不付钱,使用一些不确定的数量,你就会被列入公众的耻辱名单,只有在你付钱的情况下,你才能被删除……

编辑.htaccess如果你想从整个目录中删除X-Frame-Options。

并添加一行:Header always unset X-Frame-Options

[内容来自:克服“x帧选项禁止显示”; .

网站所有者使用X-Frame-Options响应头,这样他们的网站就不能在Iframe中打开。这有助于保护用户不受“点击劫持”攻击的影响

如果你想在自己的机器上禁用X-Frame-Options,可以尝试几种方法。

服务器端配置

如果您拥有服务器或可以与站点所有者合作,那么您可以要求设置一个配置,以根据某些条件不发送Iframe buster响应标头。条件可以是额外的请求头或URL中的参数。

例如,站点所有者可以添加一个额外的代码,当站点使用?in_debug_mode=true查询参数打开时,不发送Iframe buster报头。

使用浏览器扩展,如Requestly删除响应头

你可以使用任何浏览器扩展,如请求,它允许你修改请求&响应标头。下面是一个Requestly博客,解释了如何通过绕过Iframe buster头嵌入Iframe站点

enter image description here

配置一个直通代理,并从它删除标题

如果你需要为多人绕过Iframe buster报头,那么你也可以配置一个直通代理,它只删除帧buster响应报头并返回响应。然而,这是一个非常复杂的编写和设置。还有一些其他的挑战,比如通过代理在Iframe中打开的站点的身份验证等,但这种方法可以很好地用于简单的站点。

PS -我已经建立了这两个解决方案,并有第一手的经验。