是否有客户端方式来检测X-Frame-Options?

New*_*ang 40 html javascript browser frame x-frame-options

有没有什么好方法可以检测由于X-Frame-Options标题页面何时不会显示在页面中?我知道我可以请求页面服务器端并查找标题,但我很好奇浏览器是否有任何捕获此错误的机制.

小智 12

好吧,这个很旧但仍然相关.

事实: 当iframe加载被X-Frame-Options阻止的URL时,加载时间非常短.

Hack: 所以如果onload立即发生,我知道它可能是一个X-Frame-Options问题.

免责声明: 这可能是我编写的"最骇客"的代码之一,所以不要期望太多:

var timepast=false; 
var iframe = document.createElement("iframe");

iframe.style.cssText = "position:fixed; top:0px; left:0px; bottom:0px; right:0px; width:100%; height:100%; border:none; margin:0; padding:0; overflow:hidden; z-index:999999;";
iframe.src = "http://pix.do"; // This will work
//iframe.src = "http://google.com"; // This won't work
iframe.id = "theFrame";

// If more then 500ms past that means a page is loading inside the iFrame
setTimeout(function() {
    timepast = true;
},500);

if (iframe.attachEvent){
    iframe.attachEvent("onload", function(){
    if(timepast) {
            console.log("It's PROBABLY OK");
        }
        else {
            console.log("It's PROBABLY NOT OK");
        }
    });
} 
else {
    iframe.onload = function(){
        if(timepast) {
            console.log("It's PROBABLY OK");
        }
        else {
            console.log("It's PROBABLY NOT OK");
        }
    };
}
document.body.appendChild(iframe);
Run Code Online (Sandbox Code Playgroud)

  • 如果客户端的连接开始时延迟很差,则非常不可靠. (6认同)

BiA*_*AiB 7

免责声明:我在2012年写的这个答案(Chrome当时的版本是20版)已经过时了,我会将它保留在这里仅用于历史目的.阅读和使用需要您自担风险.


好的,这是一个有点老问题,但这是我发现的(这不是一个完整的答案)Chrome/Chromium.

检测指向外部地址的帧是否已加载的方法只是尝试访问其contentWindow或文档.

这是我使用的代码:

element.innerHTML = '<iframe class="innerPopupIframe" width="100%" height="100%" src="'+href+'"></iframe>';
myframe = $(element).find('iframe');
Run Code Online (Sandbox Code Playgroud)

然后,后来:

try {
    var letstrythis = myframe.contentWindow;
} catch(ex) {
    alert('the frame has surely started loading');
}
Run Code Online (Sandbox Code Playgroud)

事实是,如果X-Frame-Options禁止访问,那么myFrame.contentWindow将是可访问的.

这里的问题是我所谓的"当时,后来".我还没有想出要依赖什么,哪个事件可以用来查找何时是进行测试的好时机.

  • 这不再有效.访问contentWindow不会引发任何异常. (10认同)

New*_*ang 1

我唯一能想到的就是代理一个针对url的AJAX请求,然后查看标头,如果它没有X-Frame-Options,则在iframe中显示它。远非理想,但总比没有好。

  • 不幸的是,跨域问题将阻止这个工作。当然,除非您可以找到或为自己创建一个复制标头的代理。 (4认同)