克服"X-Frame-Options禁止显示"

Gar*_*ley 412 iframe frames x-frame-options

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

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

小智 208

我有一个类似的问题,我试图在iframe中显示来自我们自己网站的内容(作为带有Colorbox的灯箱式对话框),我们在那里有一个服务器范围的"X-Frame-Options SAMEORIGIN"标题源服务器阻止它加载到我们的测试服务器上.

这似乎没有在任何地方记录,但如果你可以编辑你正在尝试iframe的页面(例如,它们是你自己的页面),只需发送另一个X-Frame-Options标题,所有字符串都禁用SAMEORIGIN或DENY命令.

例如.对于PHP,推杆

<?php
    header('X-Frame-Options: GOFORIT'); 
?>
Run Code Online (Sandbox Code Playgroud)

在页面顶部将使浏览器将两者结合起来,从而产生标题

X-Frame-Options SAMEORIGIN, GOFORIT
Run Code Online (Sandbox Code Playgroud)

...并允许您在iframe中加载页面.当初始SAMEORIGIN命令在服务器级别设置时,这似乎有效,并且您希望在逐页的情况下覆盖它.

祝一切顺利!

  • 这在Chrome中似乎不再有效.无效值会导致值默认为DENY. (30认同)
  • 使用PHP,最好使用新的[`header_remove`](http://php.net/header_remove)函数,只要你有它(> = 5.3.0). (16认同)
  • 或者,如果要从整个目录中删除X-Frame-Options,则可以编辑.htaccess.只需添加以下行:`标题始终取消设置X-Frame-Options` (11认同)
  • @cawecoy:是的,重点是它无效.它依赖于浏览器忽略无效标题和"失败打开",这是未指定的行为,并且依赖于非常狡猾."GOFORIT"(或其他随机任意无效令牌)故意破坏服务器应用的安全措施; 如果您自己控制服务器(您应该为任何真正的公共服务做),那么正确的做法就是将服务器设置为不首先设置标头. (4认同)
  • 我的网站周围有一个框架.在我的网站上,我正在重定向到Instagram以获取OAUTH.由于Instagram发送`X-Frame-Options:SAMEORIGIN`,因此无法在框架内执行此操作.你必须使用弹出窗口. (3认同)

Wil*_*Wil 158

如果您收到YouTube视频的此错误,而不是使用完整网址,请使用共享选项中的嵌入网址.它看起来像http://www.youtube.com/embed/eCfDxZxTBW4

您也可以替换watch?v=embed/这样http://www.youtube.com/watch?v=eCfDxZxTBW4http://www.youtube.com/embed/eCfDxZxTBW4

  • 哦进步...我希望他们只是将我们重定向到嵌入页面而不是导致错误被抛出,并让我重写我的脚本! (12认同)

Q S*_*dio 122

如果您在尝试嵌入Google地图时遇到此错误,则iframe需要添加&output=embed到源链接.

  • 这仅适用于在iframe中嵌入谷歌地图,而不是一般的"解决方案". (117认同)
  • 我需要在灯箱中嵌入谷歌地图,所以这个"解决方案"是完美的 (17认同)
  • 如果您尝试在页面的其余部分加载后加载iframe src,即使您添加`&output = embed`,这也不起作用 (6认同)
  • 如果您尝试使用Twitter Web意图执行此操作,请忘掉它.只是丢失了一整天尝试不同的灯箱插件只是为了找到这个"虽然您可以提供IFRAME和小部件中的意图链接,但结果页面无法加载到IFRAME中." 来源:Twitter网站. (4认同)

niu*_*ech 56

UPDATE 2019:可以绕过X-Frame-Options<iframe>仅使用客户端的JavaScript和我的X框,旁路 Web组件.这是一个演示:黑客新闻X-Frame-Bypass.(在Chrome和Firefox中测试过.)

  • 这不再起作用了.它给出了"拒绝在一个框架中显示'https://news.ycombinator.com/',因为它将'X-Frame-Options'设置为'DENY'." _as_ _expected_ (5认同)
  • Chrome 63不再适用 (5认同)
  • 这是一个有趣的解决方法.在FF/Chrome/Opera中运行良好,但在IE/Edge中不起作用.谁知道会有什么事情? (3认同)
  • @ g.pickardou它适用于谷歌Chrome 46,我可以在iframe中看到黑客新闻. (2认同)

Kev*_*lla 23

添加一个

  target='_top'
Run Code Online (Sandbox Code Playgroud)

到我在Facebook标签中的链接修复了我的问题...

  • 我还添加了target ='_ top',但是此解决方案存在问题,现在链接现在在没有facebook画布的新标签页面中打开iframe. (4认同)

小智 21

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

:https
://vimeo.com/63534746:http://player.vimeo.com/video/63534746


Moh*_*ari 13

当我尝试在iframe中嵌入moodle 2时,我遇到了同样的问题,解决方法是Site administration ? Security ? HTTP security检查Allow frame embedding


Kon*_*nst 7

这是解决方案!

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

Facebook应用程序唯一有用的东西!


Flo*_*ris 6

将外部网站加载到iFrame中的解决方案即使在x-frame选项上很难设置为在外部网站上拒绝.

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

srciFrame 的属性可能有一个如下所示的网址:/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';
}
Run Code Online (Sandbox Code Playgroud)

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

请注意:您可能希望提高此脚本的安全性.因为黑客可以通过代理脚本开始加载网页.


Kai*_*ack 5

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

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

  2. 将此行添加到htaccess:

    Header always unset X-Frame-Options

从另一个域嵌入来自iframe的PHP应该可以使用了.

另外,您可以在PHP文件的开头添加:

header('X-Frame-Options: ALLOW');
Run Code Online (Sandbox Code Playgroud)

然而,在我的情况下,这不是必需的.


Dr.*_*hno 5

如果您使用Content-Security-Policy标头,则看起来X-Frame-Options Allow-From https:// ...已被折旧并被替换(并被忽略).

以下是完整的参考:https://content-security-policy.com/