检测此页面是否为跨域iframe的万无一失的方法

use*_*ca8 24 html javascript iframe cross-browser

" 检测iframe是否为跨域 "的" 万无一失的方法 "的答案描述了一种方法,用于测试页面上的iframe是指向同域还是跨域页面,解决不同浏览器对跨域策略的解释和避免会中断用户或停止javascript的错误消息.

我正在寻找相当于这个但是 iframe内部的子页面测试它是否跨域iframe 内部.

可以通过全局访问(相同域)有关父级的信息,但有没有可靠的方法来执行此跨浏览器,而不会在检测到父级是跨域时崩溃到错误parentparent.document.location


对于方便的测试,这里是一个jsfiddle中jsbin,在尝试测试是否parent.location.host可访问时崩溃成错误.是否有一种可靠的方法来获取可用的东西,比如false告诉我们这是一个跨域的父级,而不是错误?

是否有一个try...catch变体,它将是强大的跨浏览器?或者可能是一些使用返回值的巧妙技巧parent.postMessage()?(虽然父页面无法编辑)


使用案例:想象嵌入在自己网站上的页面上的可嵌入内容,以及第三方.如果页面位于同域iframe上,我们会隐藏品牌并链接回原始网站,因为用户已在此处.如果他们从第三方iframe访问该页面或直接加载页面,我们会显示品牌和信用,以便他们可以看到内容的来源.


为了澄清,我知道相同的域策略,我不关心跨浏览器域是什么,我只是想写一个简单但可靠的if条件,如if( crossDomainParent() ){ /* do something */}

pal*_*nik 43

首先检查你是否是IFramed.

window.self !== window.top
Run Code Online (Sandbox Code Playgroud)

如果您是IFramed,那么您的推荐人是您的父框架网址.

document.referrer
Run Code Online (Sandbox Code Playgroud)

通过此URL,您应该能够检测是否要分支代码.

  • document.referrer仅在框架页面未导航到任何地方时才有效!一旦发生这种情况,引用者就会成为之前的框架页面. (11认同)
  • referrer 不是一个可靠的值,它可以被停用、伪造,并且在某些情况下不是按要求发送的,例如当referrer 是 HTTPS 和目标 HTTP 时。它应该适用于您的用例思想,但我对此不太有信心。一种正确的方法是管理 2 个 URL,一个没有标记但返回 HTTP 标头 X-FrameOptions 作为 SAMEORIGIN,另一个带有标记但没有这个标头。 (2认同)

Jef*_*xon 9

真正的后期浏览器解决方案:

function isCrossOriginFrame() {
  try {
    return (!window.top.location.hostname);
  } catch (e) {
    return true;
  }
}

console.log(isCrossOriginFrame());
Run Code Online (Sandbox Code Playgroud)

在大量的桌面和移动浏览器上进行测试.

https://jsfiddle.net/arzd4btc/3/