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

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


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

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

如。对于PHP,放入

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

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

X-Frame-Options SAMEORIGIN, GOFORIT

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

祝你一切顺利!


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


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

您还可以更换手表吗?v= with embed/ so http://www.youtube.com/watch?v=eCfDxZxTBW4变成http://www.youtube.com/embed/eCfDxZxTBW4


FWIW:

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


当我尝试在iframe中嵌入moodle 2时,我也有同样的问题,解决方案是站点管理►安全►HTTP安全并检查允许框架嵌入


添加一个

  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的例子。 宝石文件(这是关键!!)来自:slideshare things i learned… 这个堆栈问题有整个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自动在表单元素上包含target="_top",但如果这对您的上下文不起作用,请尝试不同的目标值。我建议_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);

I came across this issue when running a wordpress web site. I tried all sorts of things to fix it and wasn't sure how, ultimately the issue was because I was using DNS forwarding with masking, and the links to external sites were not being addressed properly. i.e. my site was hosted at http://123.456.789/index.html but was masked to run at http://somewebSite.com/index.html. When i entered http://123.456.789/index.html in the browser clicking on those same links resulted in no X-frame-origins issues in the JS console, but running http://somewebSite.com/index.html did. In order to properly mask you must add your host's DNS name servers to your domain service, i.e. godaddy.com should have name servers of example, ns1.digitalocean.com, ns2.digitalocean.com, ns3.digitalocean.com, if you were using digitalocean.com as your hosting service.


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

https://chrome.google.com/webstore/detail/ignore-x-frame-headers/gleekbfjekiniecknbkamfmkohkpodhe/reviews


更新2019:您可以使用客户端JavaScript和我的X-Frame-Bypass Web组件绕过<iframe>中的X-Frame-Options。下面是一个演示:x帧旁路中的黑客新闻。(在Chrome和Firefox中测试。)


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

报头总是设置X-Frame-Options DENY

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

报头总是设置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 并重新启动服务器


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

在PHP文件所在的文件夹中创建一个.htaccess文件。 将这一行添加到htaccess: 报头总是不设置x帧选项

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

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

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

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


我使用的是Tomcat 8.0.30,没有一个建议对我有效。当我们希望更新X-Frame-Options并将其设置为允许时,以下是我如何配置允许嵌入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访问资源。


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

这里是完整的参考资料:https://content-security-policy.com/


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

添加到下面的iframe中

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


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

如果你想将其他网站加载到iFrame中,而你得到了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中的参数。

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

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

您可以使用任何浏览器扩展,如Requestly,它允许您修改请求和响应头。这里有一个Requestly博客,解释了如何在Iframe中嵌入站点,绕过Iframe buster头。

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

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

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