我正在写一个很小的网页,其目的是对其他页面进行构架,只是将它们合并到一个浏览器窗口中,以便于查看。我试图框住的几页禁止被框住,并抛出“拒绝显示文档,因为X-Frame-Options禁止显示”。Chrome中的错误。我了解这是一个安全限制(有充分的理由),并且无权对其进行更改。
是否有任何其他成帧或非成帧方法可以在单个窗口中显示不会被X-Frame-Options标头绊倒的页面?
我正在写一个很小的网页,其目的是对其他页面进行构架,只是将它们合并到一个浏览器窗口中,以便于查看。我试图框住的几页禁止被框住,并抛出“拒绝显示文档,因为X-Frame-Options禁止显示”。Chrome中的错误。我了解这是一个安全限制(有充分的理由),并且无权对其进行更改。
是否有任何其他成帧或非成帧方法可以在单个窗口中显示不会被X-Frame-Options标头绊倒的页面?
Answers:
我遇到了类似的问题,我试图在iframe中显示我们自己网站的内容(作为带有Colorbox的灯箱样式对话框),并且在源服务器阻止它加载到我们的测试服务器上。
这似乎没有记录在任何地方,但是如果您可以编辑要内联的页面(例如,它们是您自己的页面),只需发送另一个带有任何字符串的X-Frame-Options标头即可SAMEORIGIN或DENY命令。
例如。对于PHP,
<?php
header('X-Frame-Options: GOFORIT');
?>
页面顶部的内容将使浏览器将两者结合起来,从而产生一个标头
X-Frame-Options SAMEORIGIN, GOFORIT
...并允许您将页面加载到iframe中。当在服务器级别设置了初始SAMEORIGIN命令时,这似乎可行,并且您希望在逐页的情况下覆盖它。
祝一切顺利!
X-Frame-Options: SAMEORIGIN
,因此无法在框架内执行此操作。您必须使用一个弹出窗口。
header_remove
功能的情况下使用新功能(> = 5.3.0)。
Header always unset X-Frame-Options
GOFORIT
(或其他随机的任意无效令牌)故意破坏服务器应用的安全措施;如果您自己控制服务器(对于任何真正的公共服务都应该这样做),那么正确的做法就是将服务器设置为不首先设置标头。
如果您在YouTube视频中遇到此错误,请使用共享选项中的嵌入网址,而不是使用完整网址。看起来像http://www.youtube.com/embed/eCfDxZxTBW4
您也可以替换watch?v=
用embed/
这样http://www.youtube.com/watch?v=eCfDxZxTBW4
变http://www.youtube.com/embed/eCfDxZxTBW4
如果您在尝试将Google Maps嵌入时遇到此错误,则iframe
需要添加&output=embed
到源链接。
&output=embed
UPDATE 2019:您可以绕过X-Frame-Options
在<iframe>
仅使用客户端的JavaScript和我的X框,旁路 Web组件。这是一个演示:中的Hacker NewsX-Frame-Bypass
。(已在Chrome和Firefox中测试。)
添加一个
target='_top'
到我在facebook选项卡中的链接为我解决了这个问题...
如果在尝试嵌入Vimeo内容时遇到此错误,请将iframe的src更改为
:https
: //vimeo.com/63534746到:http : //player.vimeo.com/video/63534746
当我尝试将心情2嵌入iframe时遇到相同的问题,解决方法是Site administration ► Security ► HTTP security
并检查Allow frame embedding
如果您改为使用Content-Security-Policy标头,则X-Frame-Options Allow-From https:// ...会被弃用并被替换(并被忽略)。
这是完整的参考:https : //content-security-policy.com/
即使将x-frame选项设置为在外部网站上拒绝,也可以将外部网站加载到iFrame的解决方案。
如果您想将其他网站加载到iFrame中,并且收到Display forbidden by X-Frame-Options”
错误消息,则可以通过创建服务器端代理脚本来实际解决此问题。
src
iFrame 的属性可以具有如下所示的网址:/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请求,可能已经是普通浏览器页面访问了。
请注意:您可能想提高此脚本中的安全性。因为黑客可能会开始通过您的代理脚本加载网页。
FWIW:
iFrame
当出现这种“破坏者”代码时,我们不得不杀死我们的情况。因此,我使用PHP function get_headers($url);
在将远程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使用画布应用程序做了一些奇怪的事情,而且,您已经被警告过。如果您仍然在这里并且您有一个Rails应用程序将出现在Facebook Canvas的后面,那么您将需要:
宝石文件:
gem "rack-facebook-signed-request", :git => 'git://github.com/cmer/rack-facebook-signed-request.git'
config / facebook.yml
facebook:
key: "123123123123"
secret: "123123123123123123secret12312"
config / application.rb
config.middleware.use Rack::Facebook::SignedRequest, app_id: "123123123123", secret: "123123123123123123secret12312", inject_facebook: false
config / initializers / 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 %>
资料来源
我不确定它的相关性,但是我为此建立了一个变通方法。在我的网站上,我想在模式窗口中显示链接,该窗口包含一个加载URL的iframe。
我所做的是,我将链接的click事件链接到了此javascript函数。所有这一切都是向PHP文件发出请求,该文件检查X-FRAME-Options的URL标题,然后再决定是将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框架来源的问题,但是正在运行 http://somewebSite.com/index.html做到了。为了正确屏蔽,您必须将主机的DNS名称服务器添加到您的域服务中,例如,如果您是使用digitalocean.com作为您的托管服务。
remove_action( 'admin_init', 'send_frame_options_header',10);
绕过这个问题...
令人惊讶的是,这里没有人提到Apache
服务器的设置(*.conf
文件)或.htaccess
文件本身是导致此错误的原因。搜索您的.htaccess
或Apache
配置文件,确保没有将以下内容设置为DENY
:
Header always set X-Frame-Options DENY
将其更改为SAMEORIGIN
,可使一切正常运行:
Header always set X-Frame-Options SAMEORIGIN
如果不控制iframe中所需的源头,唯一的实际答案就是代理它。让服务器充当客户端,接收源,剥离有问题的标头,如果需要,添加CORS,然后ping您自己的服务器。
还有一个答案解释了如何编写这样的代理。这并不困难,但是我确定有人必须这样做。由于某种原因,很难找到它。
我终于找到了一些资料来源:
https://github.com/Rob--W/cors-anywhere/#documentation
^首选。如果您需要很少使用,我想您可以使用他的heroku应用程序。否则,将是您自己在自己的服务器上运行它的代码。请注意确定限制。
whatorigin.org
^第二选择,但相当古老。据说是python中的较新选择:https : //github.com/Eiledon/alloworigin
然后是第三种选择:
这似乎允许一些免费使用,但是如果您不付款并使用一些未指定的金额,就会使您进入公共耻辱列表,只有在您支付费用后才能从中删除该金额...
未提及,但在某些情况下有帮助:
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,然后重新启动了服务器
试试这个东西,我认为没有人在主题中建议过这个问题,这样可以解决您问题的70%,对于其他一些页面,您必须报废,我有完整的解决方案,但不公开,
在下方添加到您的iframe
sandbox =“ allow-same-origin允许脚本允许弹出窗口允许形式”
如果要从整个目录中删除X-Frame-Options,请编辑.htaccess。
并添加以下行:标头始终未设置X-Frame-Options
[内容来自:克服“ X-Frame-Options禁止显示”