好的,我有一个页面在这个页面上有一个iframe。我需要做的是在iframe页面上,找出主页面的URL是什么。

我四处搜索,我知道这是不可能的,如果我的iframe页面是在不同的域,因为这是跨站脚本。但我读过的所有地方都说,如果iframe页面与父页面在同一个域上,它应该工作,例如:

parent.document.location
parent.window.document.location
parent.window.location
parent.document.location.href

…或者其他类似的组合,因为似乎有多种方法可以获得相同的信息。

不管怎样,问题来了。我的iframe与主页在同一个域上,但不是在同一个SUB域上。举个例子

http:// www.mysite.com/pageA.html

然后我的iframe URL是

http:// qa-www.mysite.com/pageB.html

当我试图从pageB.html (iframe页面)抓取URL时,我一直得到相同的访问拒绝错误。因此,即使子域也可以算作跨站脚本,这是正确的,还是我做错了什么?


当前回答

我发现在$_SERVER['HTTP_REFERER']不工作的情况下(我在看你,Safari), $_SERVER['REDIRECT_SCRIPT_URI']一直是一个有用的备份。

其他回答

对于同一域和不同子域上的页面,可以设置文档。通过javascript的域属性。

父帧和iframe都需要设置它们的文档。域是指它们之间共有的东西。

即。 www.foo.mydomain.com和api.foo.mydomain.com都可以使用foo.mydomain.com或只使用mydomain.com,并且是兼容的(不,出于安全原因,你不能将它们都设置为com…)

另外,请注意文档。领域是一条单行道。考虑按顺序运行以下三条语句:

// assume we're starting at www.foo.mydomain.com
document.domain = "foo.mydomain.com" // works
document.domain = "mydomain.com" // works
document.domain = "foo.mydomain.com" // throws a security exception

现代浏览器也可以使用window。postMessage用于跨起源对话,但它在IE6中不起作用。 https://developer.mozilla.org/en/DOM/window.postMessage

你是正确的。当使用iframe时,子域仍然被认为是单独的域。可以使用postMessage(…)传递消息,但其他JS api被故意设置为不可访问。

还可以根据上下文获取URL。详见其他答案。

假设你要告诉父页面如何设置iframe,以轻松但不安全的方式获得包含路径和URL参数的完整URL,在指定iframe时包含referrerpolicy=" not - safe- URL ":

<iframe src="https://example.com/innersite" referrerpolicy="unsafe-url" title="My Title"></iframe>

然后你可以得到完整的原始URL:

document.referrer

许多其他答案只有当iframe src与父域相同时才有效。

Fallbacks:

如果存在安全问题,您可以像https://stackoverflow.com/a/5697801/1226799所说的那样进行回退,其中父节点在iframe URL的URL参数中显式地发送其URL,但攻击者可以很容易地伪造这一点。

我相信您还可以使用消息传递并检查事件的起源:https://stackoverflow.com/a/61548595/1226799

是的,如果iframe和主页不在同一个(子)域中,则不允许访问父页面的URL。然而,如果你只需要主页面的URL(即浏览器的URL),你可以试试这个:

var url = (window.location != window.parent.location)
            ? document.referrer
            : document.location.href;

注意:

允许Window.parent.location;它避免了OP中的安全错误,这是由访问href属性引起的:window.parent.location.href导致“Blocked a frame with origin…”

文档。referrer指的是“链接到该页的页面的URI”。如果其他源决定了iframe的位置,则可能不会返回包含的文档,例如:

容器iframe @域1 将子iframe发送到Domain 2 但是在子iframe中。域2重定向到域3(即用于身份验证,可能是SAML),然后域3定向回域2(即通过表单提交(),一种标准的SAML技术) 对于子文件iframe。引用者将是Domain 3,而不是包含的Domain 1

文档。location指的是“一个location对象,它包含关于文档URL的信息”;假定是当前的文档,即当前打开的iframe。当窗口。Location === window.parent。位置,那么iframe的href与包含父元素的href相同。

下面这行就可以了:document.location。ancestry origins[0]这个返回祖先域名。