18910140161

JavaScript-Intercept/Proxy window.postMessage-堆栈溢出

顺晟科技

2022-10-18 13:21:57

42

我的应用程序中,我们使用了第三方分析库,除了其他功能外,还使用postMessage将一些信息发布到父窗口(可能用于分析库的iFrame用例)。

在我们的例子中,此信息是敏感的,我们不想将其发送到父窗口(如果我们的应用程序在iFrame中打开或被某人作为子窗口打开),因为我们无法控制父窗口如何处理此信息(即使是有效的父窗口)。磁带库中没有用于关闭此功能的配置。

作为一个潜在的解决方案,我们发现,如果我们可以拦截所有发送到父窗口的postMessages,并只过滤此消息,它将解决我们目前的目的。为了实现这一点,我一直在考虑代理window.postMessage或重新定义用于添加此验证的方法。

我只是想知道这是否可行,如何可行?

  • 是否可以从当前窗口覆盖ParentWindow.PostMessage(或者就此而言,覆盖ChildWindow.PostMessage?)
到目前为止我尝试了

什么:

在窗口A中,我打开窗口B,然后从WindowA向WindowB发送PostMessage.(这需要在WindowA中引用WindowB,以便我可以执行WindowB.PostMessage)

如果我代理window.postMessage,它不会拦截WindowB.postMessage调用。如果我代理windowB.postMessage,它将拦截windowB.postMessage调用。

我只是想了解同样的方法是否适用于ParentWindow,以及其他限制(相同来源等)

是什么。

CodeSandBox链接:https://codesandbox.io/s/postmessage-forked-slv9b?file=/index.html.

<代码><;!文档类型HTML>;<;HTML Lang=";英文";>;<;头部>;<;元字符集=";UTF-8";/>;<;元名称=";视口";内容=";宽度=设备宽度,初始比例=1.0";/>;<;meta HTTP-equiv=";X-ua-compatible";内容=";IE=边缘";/>;<;标题>;静态模板<;/标题>;<;/标题>;<;身体>;<;输入类=";s";类型=";文本";/>;<;按钮类=";s";>;发送<;/按钮>;<;脚本>;常量处理程序={应用:函数(目标,这个参数,参数列表){console.log(`窗口发布消息代理:${argumentsList[0]}`);返回目标(..参数列表);}};常量写入=(str)=>;document.body.insertAdjacentHTML(";beforeEnd";,str+";<;br>;&quo;);写入(";<;HR>;";);// --常量窗口功能=";菜单栏=是,位置=是,可调整大小=是,滚动条=是,状态=是";/**@type{window|undefined}*/列子窗口;/**@type{HTMLButtonElement}*/const button=document.queryselector(";button.s";);/**@类型{HTMLInputElement}*/const input=document.querySelector(";input.s";);button.onclick=()=>;{如果(!子窗口){SUBWINDOW=window.open(";/reciver.HTML";,";SHIPPING";,WindowFeatures);setTimeout(()=>;{//此处的此处理子窗口.postMessage=新代理(子窗口.postMessage,处理程序);subwindow.postMessage(input.value,window.location.origin);}, 3000);}否则{subwindow.postMessage(input.value,window.location.origin);}写(输入.值);};<;/脚本>;<;/正文>;<;/HTML>;

顺晟科技:

  • TAG:
相关文章
我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航