javascript - 检测iframe是否跨域的万无一失的方法

标签 javascript html security iframe cross-domain

我正在尝试确定任何 iframe 是否跨域。根据这个问题中接受的答案:Detect when iframe is cross-domain, then bust out of it它说将访问 iframe 的 contentDocument 的代码放在 try/catch block 中。我在 Chrome 中尝试了跨域 iframe:

try { 
  document.getElementsByTagName('iframe')[0].contentDocument;
} catch(err){
  console.log("called");
}

它仍然抛出跨域错误并且没有捕获错误。

我还尝试检查父页面 url 的协议(protocol)+主机+端口是否在 iframe 的 src 中:

function thirdPartyIframe(iframe){
  var url = document.location.protocol + "//" + document.location.hostname + (document.location.port === "" ? "" : ":" + document.location.port);
  var regexp = new RegExp(url.replace(/\//g, "\\/").replace(/\./g, "\\."));
  if (iframe.src === '' || regexp.test(iframe.src)){
    return false;
  } else {
    return true;
  }
}

但这似乎不适用于 Facebook 主页上第一个 src 等于(很长)的 iframe:

"http://www.facebook.com/ai.php?aed=AQLlH2cfdnsnLrDUVyqrQPlWpayw9N09Z_iNuhulevbeEfVa4mcVRcT8cjAZOjQb8y1QXab5Ae3aSEJx49U_Qv35rtSp1VC9cY0_CrpOjMDk40hS_Xm57A996YtRVCcWSuRZ_jZERQ_iA_E4621NAbKHT9dsB7uElkRtTvl5K-zPI0jeH-BEnlZIOXbeEdbRC6qCwoToaltolpe-Ot2KWgkfb_vBZYpzUc3jQoEHzLG6tauO9l_hkXpYpHxnt-KYFKIFZ1PgmrHgb0UcGjeKHl7yBR1AbW2n5XgdgaAhFvBjs5GZlKy566nvl8eLRA60orwkwtWYeN8-gKoAmOLm7-6minsWn8lk1h2Qn3p07HCTSnYHfv1aJ6mF5jmuzP0YYe7Ym9ZbmK-tvax4uPAQJ2OdULilKbEh8M-2V9pVY3AC228OPlrRullZuuOg8DI2A8WeMF-fbbOdOFFVCe5Gj1CaZu3LYXiqdG7mUgY6AEpk9ZzGT4fC2K8DInQo1AypCvzG64C_bEWfODeXe0aGbkWwsUUmO7E5HFg0tvZkK5IAR_xxxQ2rlf5jbcEDo_2gdIDdHe1HT75-SJLUsSA0M8EU01oNNPuWwEC2BW6inepc9QPuqeg42tcEbKLU-rIUnXDBLvgutft8azWPPQ6_LafGjCAmC9uTalagoWLLDMpQOThvPg7YeVd7qg_c9Mzn2GAfuswcxDSxyRIZo9MaOhA6mhfXeE1tmjyBBsMxnx08tO21Jsfgch59fmMxpeJzdsNMPK3FAojfglvCQ2Zrt_6ataexUB4xlM7_PhKrfBPtxb5fe2TE9-nlWruNEpoCrzI05yv4Go3CYEWHob06K_9iICfNVTFkSYGTiJnMXCy_fdgfyzUIn5QJIPRo4-Wnyg444zKAO_nyFW59LqbIanHVfFY6ybiA6KeC3meREWzTPSsrU5d_NbYHlJWb8uPNDR04jaH5e2qiYj3Y8qgLQA5m"

我的函数将其归类为非第三方 iframe,但当我访问其 contentDocument 时,Chrome 仍然抛出跨域错误。

我正在寻找一种万无一失的跨浏览器方式来做到这一点。

最佳答案

您需要做的比 try/catch 中的多一点,以处理不同的浏览器并处理浏览器处理跨域访问的不同方式:

function canAccessIFrame(iframe) {
    var html = null;
    try { 
      // deal with older browsers
      var doc = iframe.contentDocument || iframe.contentWindow.document;
      html = doc.body.innerHTML;
    } catch(err){
      // do nothing
    }

    return(html !== null);
}

在您的示例中,这将是:

var accessAllowed = canAccessIFrame(document.getElementsByTagName('iframe')[0]);

工作演示:http://jsfiddle.net/jfriend00/XsPL6/

在 Chrome 21、Safari 5.1、Firefox 14、IE7、IE8、IE9 中测试。

关于javascript - 检测iframe是否跨域的万无一失的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12381334/

相关文章:

javascript - 使用 jquery 动态删除表行不起作用

javascript - Django CMS/WYMEditor 停止剥离空白

html - 在主页中使用 HTML 相对地址

javascript - 共享主机上的安全 MySQL 密码

android - 拥有.apk 可以提取其源代码。 Android 应用程序安全吗?

javascript - 尝试使用 subString 和 indexOf 从文本中获取 <img> 标签

javascript - 保持元素滚动到底部

javascript - 允许用户更改背景?并插入数据库

css - 非常长的单词不包含在 HTML/CSS 中

java - WSSecurityException - 处理 <wsse :Security> header 时发现错误