javascript - Javascript,跟踪 iframe 重定向顶部窗口
问题描述
由于除了沙盒之外没有办法阻止 iframe 重定向顶部框架,这会阻止可见度跟踪所需的其他功能,我想跟踪重定向。由于一个站点可以有多个 iframe,因此它可以是其中任何一个。
有什么方法可以跟踪/找出哪个(特定 iframe)导致顶部框架重定向?
这是一个沙箱(使用浏览器控制台并启用保留日志):
请注意,iframe 内容通常是跨域的。为了便于使用,它在 Sandox 内。
解决方案
我们可以使用类似的方式访问 iframe 内容,iframe.contentWindow.document
但如果我们遵守Same-origin policy ,这是可能的。
另一种方法可能是设置一个Content-Security-Policy
标题,如:
<meta http-equiv="Content-Security-Policy" content="frame-src http://example.com">
父页面中的此标头可防止在框架中加载与http://example.com不同的站点,还有一种方法可以报告发送帖子的拒绝行为,但遗憾的是不能使用<meta>
标签设置(它只是服务器端) . 使用这种方法,我们必须执行白名单,所以我认为在这种情况下它可能没有用。但是,如果第一次给出白名单,可能会设置所有站点可用,所以当 iframe 重定向时,浏览器会拒绝加载它。
如果不是同源的情况和执行白名单的可能性,那么我认为我们可以做的更好的是调用 iframeonunload
事件,不幸的是,当 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,我创建了 iframe3.html ,它既不会刷新也不会重新加载以清楚地表明这一点。我还创建了一个简单的重定向或重新加载 iframe 列表。
更新
据我所知,您想要的是设置具有沙盒属性的 iframe,并将所有您想要但没有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/4x8v1mojq7允许
allow-top-navigation
但codesandbox阻止框架重定向所以如果我们尝试https://4x8v1mojq7.codesandbox.io/这是由codesandbox创建的 url ,我们可以看到顶部框架重新加载。
正如我在评论中所说,至少在 Chrome 64.0.3282.167 中,当 iframe 尝试重定向顶部框架时,当我们委托除了 allow-top-navigation 之外的所有内容时,它会引发异常。Firefox 中的行为不同(至少 58.0.2)。Firefox 拒绝顶部导航,但继续执行代码。
因此,作为结论,我认为最好的方法是 sanbox 和 onunload 或仅 onunload 的组合。当然,如果可能的话,Content-Security-Policy 是最安全、更灵活的方式。这取决于实施。我认为不涉及服务器端代码来执行完美的解决方案几乎是不可能的。有白名单要检查,比如这个 API https://developers.google.com/safe-browsing/v4/有黑名单要检查,看看这个帖子https://security.stackexchange.com/questions/ 32058/looking-for-url-blacklists-of-malicious-websites。
推荐阅读
- javascript - 是否可以在 JavaScript 代码执行的每个 console.log 语句上暂停 chrome 调试器?
- caching - Varnish 已缓存但 Google Chrome 显示未缓存?
- javascript - 在 Jacascript 中转换对象数组
- hadoop - 无法通过直线连接 hive jdbc
- python - 在 GPU 上激活 Tensorflow 2.0 时遇到问题
- r - 如何将工作表名称作为变量添加到我的数据框中
- c++ - 在 C++ 中将 uint8_t 数组转换为字符串
- python-3.x - 在图形并行计算中处理相互依赖的文件
- python - 根据特定增量将数据分组在一起
- python - 不在子类中运行的属性和设置器装饰器