检测iframe src是否可显示

时间:2017-01-08 22:39:56

标签: javascript jquery html iframe

我想在iframe中加载外部网站,如果其中任何一个网站使用了框架拦截器,那么我想将用户重定向到错误页面。已经有一些提议的方法:

  • 等待上传超时
  • 查看iframe src html内容是否为“空”'加载后
  • 尝试发现错误
  • 维护一个列入黑名单的数据库'网址

到目前为止,令人沮丧的是,我在最后一项中运气最好。其他方法无法正常工作,原因如下:

  • 等待上传超时:
    • onload事件即使在使用框架杀手的网站上也会触发。例如,如果我尝试访问www.google.com,则只会加载空的html结构。
  • 查看iframe src html内容是否为“空”'加载后
    • 由于原始政策相同,您无法访问iframe的外部src内容。
  • 尝试捕获错误:
    • 根据我的理解,我只能找到与本地JS代码产生的错误有关的错误处理函数,而且与"Refused to display <URL> in a frame because it set 'X-Frame-Options' to 'SAMEORIGIN' / 'DENY'"等错误无关。
  • 维护一个列入黑名单的数据库&#39;网址:
    • 这显然是一个糟糕的解决方案,它不太全面,也是一个很重要的列表哈哈。

也许我误解了其中一种方法。这里有解决方案吗?我失踪了吗?对于上下文,我主要在JS + jQuery中执行此操作。

1 个答案:

答案 0 :(得分:0)

我有一个临时修复,使用标题信息作为@charlietfl建议,虽然它并不完美,你可以在测试部分看到,并非所有网站都在其标题中列出x-frame选项。

<?php 

// checkXFO
// checks x-frame options
// $headers: an array of headers
// returns: nothing
function checkXFO($headers){
    if($headers['X-Frame-Options']==""){
        echo "good to embed! <p>";
    }
    else{
        echo "Denied! <p>";
    }
}

//-----------------------
// tests
//-----------------------

// x-frame option: SAMEORIGIN
// should deny
// > passes
$headerArray = get_headers('http://www.google.com',1); 
checkXFO($headerArray);

// x-frame option: DENY
// should deny
// > passes
$headerArray = get_headers('http://www.facebook.com',1); 
checkXFO($headerArray);

//x-frame option: none
// should accept
// > passes
$headerArray = get_headers('http://wikipedia.org',1); 
checkXFO($headerArray);

//x-frame option: none
// should accept
// > passes
$headerArray = get_headers('http://neopets.com',1); 
checkXFO($headerArray);

//x-frame options: DENY
// should deny
// > fails
$headerArray = get_headers('http://www.yahoo.com',1); 
checkXFO($headerArray);

//x-frame option:none. Redirected x-frame options: DENY
// should deny
// > fails
$headerArray = get_headers('http://www.yahoo.ca',1); 
checkXFO($headerArray);
?>