我正在编写一个小网页,其目的是构筑其他一些页面,只是将它们合并到一个浏览器窗口中以便于查看。我试图框住的一些页面禁止被框住并抛出“拒绝显示文档,因为 X-Frame-Options 禁止显示”。Chrome 中的错误。我知道这是一个安全限制(有充分的理由),并且无权更改它。
是否有任何替代框架或非框架方法可以在不会被 X-Frame-Options 标题绊倒的单个窗口中显示页面?
我正在编写一个小网页,其目的是构筑其他一些页面,只是将它们合并到一个浏览器窗口中以便于查看。我试图框住的一些页面禁止被框住并抛出“拒绝显示文档,因为 X-Frame-Options 禁止显示”。Chrome 中的错误。我知道这是一个安全限制(有充分的理由),并且无权更改它。
是否有任何替代框架或非框架方法可以在不会被 X-Frame-Options 标题绊倒的单个窗口中显示页面?
我有一个类似的问题,我试图在 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 命令设置在服务器级别时,这似乎有效,并且您希望逐页覆盖它。
祝一切顺利!
如果您在 YouTube 视频中收到此错误,请使用共享选项中的嵌入网址,而不是使用完整网址。它看起来像http://www.youtube.com/embed/eCfDxZxTBW4
您也可以替换watch?v=
为embed/
http://www.youtube.com/watch?v=eCfDxZxTBW4
http://www.youtube.com/embed/eCfDxZxTBW4
如果您在尝试将 Google 地图嵌入到 中时遇到此错误,则iframe
需要添加&output=embed
到源链接。
2019 年更新:您可以仅使用客户端 JavaScript 和我的X-Frame-Options
X -Frame-Bypass Web组件绕过。这是一个演示:Hacker News in an . (在 Chrome 和 Firefox 中测试。)<iframe>
X-Frame-Bypass
Chrome 有一个插件,可以删除该标题条目(仅供个人使用):
添加一个
target='_top'
到我在 facebook 选项卡中的链接为我解决了这个问题......
如果您在尝试嵌入 Vimeo 内容时遇到此错误,请将 iframe 的 src
从:https
://vimeo.com/63534746 更改为: http: //player.vimeo.com/video/63534746
当我尝试将moodle 2嵌入iframe时遇到同样的问题,解决方案是Site administration ► Security ► HTTP security
并检查Allow frame embedding
这是解决方案伙计们!
FB.Event.subscribe('edge.create', function(response) {
window.top.location.href = 'url';
});
唯一适用于 Facebook 应用程序的东西!
我尝试了几乎所有的建议。然而,唯一真正解决问题的是:
.htaccess
在您的 PHP 文件所在的同一文件夹中创建一个。
将此行添加到 htaccess:
Header always unset X-Frame-Options
之后应该可以通过来自另一个域的 iframe 嵌入 PHP。
此外,您可以在 PHP 文件的开头添加:
header('X-Frame-Options: ALLOW');
然而,在我的情况下,这不是必需的。
如果您改用Content-Security-Policy标头,则X-Frame-Options Allow-From https://...似乎已被折旧并被替换(并被忽略)。
我对 mediawiki 也有同样的问题,这是因为服务器出于安全原因拒绝将页面嵌入到 iframe 中。
我解决了它写作
$wgEditPageFrameOptions = "SAMEORIGIN";
进入 mediawiki php 配置文件。
希望能帮助到你。
FWIW:
iFrame
当这个“破坏者”代码出现时,我们需要杀死我们的情况。因此,我使用 PHPfunction get_headers($url);
在将远程 URL 显示为iFrame
. 为了获得更好的性能,我将结果缓存到一个文件中,这样我就不会每次都建立 HTTP 连接。
我使用的是 Tomcat 8.0.30,没有任何建议对我有用。当我们正在寻找更新X-Frame-Options
并将其设置为 时ALLOW
,这是我配置为允许嵌入 iframe 的方式:
<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>
唯一有一堆答案的问题。欢迎来到我希望在我努力让它在截止日期晚上 10:30 工作时拥有的指南……FB 用画布应用程序做了一些奇怪的事情,好吧,你已经被警告过了。如果您还在这里,并且您有一个将出现在 Facebook Canvas 后面的 Rails 应用程序,那么您将需要:
宝石文件:
gem "rack-facebook-signed-request", :git => 'git://github.com/cmer/rack-facebook-signed-request.git'
配置/facebook.yml
facebook:
key: "123123123123"
secret: "123123123123123123secret12312"
配置/应用程序.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
登录.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 %>
来源
<form target="_parent" ... />
使用 Kevin Vella 的想法,我尝试在 PayPal 的按钮生成器制作的表单元素上使用上述内容。为我工作,以便 Paypal 不会在新的浏览器窗口/选项卡中打开。
更新
这是一个例子:
从今天(2021 年 1 月 19 日)开始生成一个按钮,PayPal 会自动包含target="_top"
在该form
元素上,但如果这不适用于您的上下文,请尝试不同的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>
The only real answer, if you don't control the headers on your source you want in your iframe, is to proxy it. Have a server act as a client, receive the source, strip the problematic headers, add CORS if needed, and then ping your own server.
There is one other answer explaining how to write such a proxy. It isn't difficult, but I was sure someone had to have done this before. It was just difficult to find it, for some reason.
I finally did find some sources:
https://github.com/Rob--W/cors-anywhere/#documentation
^ preferred. If you need rare usage, I think you can just use his heroku app. Otherwise, it's code to run it yourself on your own server. Note sure what the limits are.
whateverorigin.org
^ second choice, but quite old. supposedly newer choice in python: https://github.com/Eiledon/alloworigin
then there's the third choice:
Which seems to allow a little free usage, but will put you on a public shame list if you don't pay and use some unspecified amount, which you can only be removed from if you pay the fee...
我不确定它有多相关,但我为此建立了一个解决方法。在我的网站上,我想在包含加载 URL 的 iframe 的模式窗口中显示链接。
我所做的是,我将链接的点击事件链接到这个 javascript 函数。所有这些都是向 PHP 文件发出请求,该文件检查 URL 标头中的 X-FRAME-Options,然后再决定是在模式窗口中加载 URL 还是重定向。
这是功能:
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";
}
?>
希望这可以帮助。
我在运行 wordpress 网站时遇到了这个问题。我尝试了各种方法来修复它,但不确定如何解决,最终问题是因为我使用了带有掩码的 DNS 转发,并且没有正确处理指向外部站点的链接。即我的网站托管在http://123.456.789/index.html但被掩盖在http://somewebSite.com/index.html运行。当我在浏览器中输入http://123.456.789/index.html时,单击这些相同的链接导致 JS 控制台中没有 X-frame-origins 问题,但运行http://somewebSite.com/index.html做过。为了正确屏蔽,您必须将主机的 DNS 名称服务器添加到您的域服务中,即 godaddy.com 应该具有例如 ns1.digitalocean.com、ns2.digitalocean.com、ns3.digitalocean.com 的名称服务器,如果您是使用 digitalocean.com 作为您的托管服务。
令人惊讶的是,这里没有人提到Apache
服务器的设置(*.conf
文件)或.htaccess
文件本身是导致此错误的原因。搜索您的.htaccess
或Apache
配置文件,确保您没有将以下设置设置为DENY
:
Header always set X-Frame-Options DENY
将其更改为SAMEORIGIN
,使事情按预期工作:
Header always set X-Frame-Options SAMEORIGIN
使用下面给出的这一行而不是header()
函数。
echo "<script>window.top.location = 'https://apps.facebook.com/yourappnamespace/';</script>";
未提及,但在某些情况下可以提供帮助:
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);
我有这个问题,并解决它编辑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 并重新启动服务器
Edit .htaccess if you want to remove X-Frame-Options from an entire directory.
And add the line: Header always unset X-Frame-Options
[contents from: Overcoming "Display forbidden by X-Frame-Options"
Site owners use the X-Frame-Options
response header so that their website cannot be opened in an Iframe. This helps to secure the users against clickjacking attack
There are a couple of approaches that you can try if you want to disable X-Frame-Options on your own machine.
If you own the server or can work with the site owner then you can ask to set up a configuration to not send the Iframe buster response headers based on certain conditions. Conditions could be an additional request header or a parameter in the URL.
For example - The site owner can add an additional code to not send Iframe buster headers when the site is opened with ?in_debug_mode=true
query param.
You can use any browser extension like Requestly which allows you to modify the request & response headers. Here's a Requestly blog that explains how to embed sites in Iframe by bypassing Iframe buster headers.
If you need to bypass Iframe buster headers for multiple folks, then you can also configure a pass-through proxy that just removes the frame buster response headers and return back the response. This is however a lot complicated to write, set up. There are some other challenges like authentication etc with the sites opened in Iframe through a proxy but this approach can work for simple sites pretty well.
PS - I have built both solutions and have first-hand experience with both.
试试这个东西,我认为没有人在主题中提出这个建议,这将解决你 70% 的问题,对于其他一些页面,你必须废弃,我有完整的解决方案,但不公开,
在下面添加到您的 iframe
sandbox="allow-same-origin 允许脚本允许弹出窗口允许表单"