Javascript,跟踪 iframe 重定向顶部窗口

2024-03-10

由于除了沙箱之外,没有办法阻止 iframe 重定向顶部框架,沙箱会阻止可见性跟踪所需的其他功能,因此我想跟踪重定向。由于一个站点可以有多个 iframe,因此它可以是其中任何一个。

有没有办法跟踪/找出哪个(特定的 iframe)导致顶部框架重定向?

这是一个沙箱(使用浏览器控制台并启用保留日志):

Noteiframe 内容通常是跨域的。为了便于使用,它位于沙箱内。


我们可以通过类似的方式访问 iframe 内容iframe.contentWindow.document但这是可能的如果我们观察同源策略 https://en.wikipedia.org/wiki/Same-origin_policy.

另一种方法可能是设置Content-Security-Policy https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy标题如:

<meta http-equiv="Content-Security-Policy" content="frame-src http://example.com">

父页面中的此标头可防止加载与以下网站不同的网站http://example.com http://example.com在框架中,还有一种方法report https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/report-uri发送帖子的拒绝行为,但遗憾的是无法设置<meta>标签(这只是服务器端)。通过这种方法,我们必须执行白名单,所以我认为在这种情况下它可能没有用。但是,如果第一次给出白名单,有可能设置所有可用的站点,因此当 iframe 重定向时,浏览器将拒绝加载它。

如果不是同源的情况以及执行白名单的可能性的话,那么我觉得更好的办法就是调用iframeonunload https://developer.mozilla.org/es/docs/Web/API/GlobalEventHandlers/onunload事件,不幸的是,当 iframe 页面重新加载时,不仅在重定向时,还会触发此事件。我认为这是最接近的方法。为了实现这一点,这段代码是有效的。

var srcs = ["iframe2.html","iframe.html","iframe2.html"];


        for (let i = 0; i < srcs.length; i++) {
            var iframe = document.createElement('iframe'); 
                iframe.src = srcs[i]; 
                iframe.name = "i"+i; 
                document.body.appendChild(iframe);
                window["i"+i].onunload = function(){console.log("change "+i)}
        }

当然onunload当所有 iframe 加载时第一次触发,因此重定向是第 2 个、第 3 个,依此类推。但我们可以排除第一种情况。

这是一个完整的例子https://codesandbox.io/s/o16yk7mqy https://codesandbox.io/s/o16yk7mqy,我创建了 iframe3.html,它既不刷新也不重新加载以清楚地显示这一点。我还创建了一个简单的重定向或重新加载 iframe 列表。

UPDATE据我现在了解,你想要的是设置 iframesandbox https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe#attr-sandbox属性并将所有您想要但没有的内容列入白名单allow-top-navigation, 就像是:

<iframe src="iframe.html" sandbox="allow-script allow-forms allow-popups allow-pointer-lock allow-same-origin"></iframe>
  • 这个例子不允许allow-top-navigation https://codesandbox.io/s/lpmv6wr6y9 https://codesandbox.io/s/lpmv6wr6y9
  • 这个例子在这里https://codesandbox.io/s/4x8v1mojq7 https://codesandbox.io/s/4x8v1mojq7 allow allow-top-navigation but 代码沙箱阻止框架重定向,所以如果我们尝试https://4x8v1mojq7.codesandbox.io/ https://4x8v1mojq7.codesandbox.io/这是创建的网址代码沙箱,我们可以看到顶部框架重新加载。

正如我在评论中所说,至少在 Chrome 64.0.3282.167 中,当我们在 iframe 尝试重定向顶部框架时委托除allow-top-navigation 之外的所有内容时,它会抛出异常。 Firefox(至少 58.0.2)中的行为有所不同。 Firefox 拒绝顶部导航,但继续执行代码。

因此,作为结论,我认为最好的方法是 sanbox 和 onunload 的组合,或者只是 onunload。当然,如果可以的话,Content-Security-Policy是最安全、更灵活的方式。这取决于实施。我认为不涉及服务器端代码来执行完美的解决方案几乎是不可能的。有白名单可以检查,比如这个APIhttps://developers.google.com/safe-browsing/v4/ https://developers.google.com/safe-browsing/v4/还有黑名单可以查,看这个帖子https://security.stackexchange.com/questions/32058/looking-for-url-blacklists-of-malicious-websites https://security.stackexchange.com/questions/32058/looking-for-url-blacklists-of-malicious-websites .

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Javascript,跟踪 iframe 重定向顶部窗口 的相关文章