2

在我的应用程序中,我有一个 iframe 可以打开任何网页(99% 的时间都是同源的)。但是用户可以点击 iframe 内的链接并访问外部网站。我设法检测到该网站是否具有相同的来源,但是对诸如“ https://www.google.ca/ ”之类的网站的请求会引发以下错误:

拒绝在框架中显示“ https://www.google.ca/ ”,因为它将“X-Frame-Options”设置为“SAMEORIGIN”。

我有一个绑定到我的 iframe 的 beforeunload、onerror 和 onload 事件,但我无法用事件对象处理这个安全问题。

4

1 回答 1

0

有同样的问题,将第 3 方页面加载到我的 iframe 中,其中一些被 HTML 中未包含的 X-Frame-Options 阻止。

注意:在 CHROME、iPhone、Mozilla Android 4.4.2 上工作,但在 FireFox 上不工作。

如果您希望这些页面在新窗口中打开,这就是我的管理方式。对于其他人为这个特定场景搜索解决方案可能有用的东西。

PHP(get_headers)对他们中的大多数人来说都很好,但我遇到了少数没有将 X-Frame-Options 直接放入 HTML 标头(自动包含),因此 get_headers 失败并且浏览器收到此 [Load denied by X-Frame-Options: your_guest_url 不允许跨域框架。]

我必须在我的第一页上添加链接,让用户通过单击它在新窗口中打开有问题的页面,并使用 javascript、加载图标和 setTimeout() 创建中间页面。

firstpage.php [在 'iframe' 下方带有 'iframe' 和 'a']

<?php
foreach(get_headers("http://".$_REQUEST["address"]) as $v) {
    if($v == "X-Frame-Options: SAMEORIGIN" || $v == "X-Frame-Options: DENY") {
    header("location: http://".$_REQUEST["address"]);
    die();
    }
}
?>

<iframe id="iframe-id" src="secondpage.php"></iframe>
<a href=your_guest_url>go to your_guest_url</a>

<script language='javascript'>
setTimeout(function() {
document.getElementById('iframe-id').src = 'your_guest_url';
},500);
</script>

secondpage.php [加载到 iframe]

<div class="loading-info">
    <div id="loading-info" class="loading-info-content">
            <i class="fa fa-3x fa-spinner fa-pulse"></i>
    </div>
</div>

<script>
setTimeout(function() {
document.getElementById("loading-info").innerHTML = "<p'>USE LINK BELOW IFRAME</p>";
},5000);
</script>

没有“隐藏”X-Frame-Options 的页面在 500 毫秒后通过 javascript 加载到 iframe 中,有问题的页面不会加载,因此 secondpage 停留在 iframe 中并执行 javascript setTimeout();。

于 2015-09-11T11:24:58.133 回答