编程语言
首页 > 编程语言> > javascript – 如何防止iframe修改顶级浏览上下文(top.history)?

javascript – 如何防止iframe修改顶级浏览上下文(top.history)?

作者:互联网

我尝试创建一些布局管理Web应用程序,它能够托管其中的其他子应用程序(同域).

Overview

目前,主应用程序可以跟踪子应用程序中的任何导航并在主应用程序中保存导航记录.用户可以单击后退或前进按钮转到最近页面.一切正常,直到我在子应用程序中找到一些代码,以编程方式更改location.hash属性或在子应用程序中调用history.pushState方法.

通常,浏览器会自动将旧历史状态添加到正确的子应用程序的历史堆栈中.但是现代浏览器总是在主应用程序和导致主要应用程序的破碎历史的所有其他iframe(子应用程序)之间共享历史堆栈.用户无法在浏览器中单击返回主应用程序之前访问的上一页.

根据W3C

The joint session history of a top-level browsing context is the union
of all the session histories of all browsing contexts of all the fully
active Document objects that share that top-level browsing context,
with all the entries that are current entries in their respective
session histories removed except for the current entry of the joint
session history.

我有两个问题.

>是否可以为每个iframe创建单独的历史记录?我尝试像这样设置document.domain.

>主要应用领域是’apps.site.com’.
>子应用程序域是’apps.site.com’但我将其更改为’site.com’以防止跨站点脚本.但它不起作用,因为浏览器同步此历史记录而不是iframe.

>有没有办法阻止iframe导航/ hashchange / pushState?
我目前的想法是修补每个相关的属性/方法,并听取click事件以防止更改浏览器历史记录.我不确定这会起作用,这样做似乎太冒险了.

谢谢,

参考:
https://html.spec.whatwg.org/multipage/browsers.html#traverse-the-history

解决方法:

我知道Chrome有一个新标签,它在一个与您的应用程序不同的进程中运行.您可以查看:https://developer.chrome.com/apps/tags/webview

但是这个标签不是HTML5标准化的标签.大多数其他主流浏览器都不支持此功能.

但对于Iframe,答案是否定的.

标签:javascript,html5,iframe,html5-history
来源: https://codeday.me/bug/20190711/1430741.html