我在网址https://parent.com
有一个网页,并在其中注入了一个iframe,内容为https://iframe.com
。 iframe有一个名为iframe_variable
的全局变量。我想从iframe_variable
文档访问parent
。
我知道浏览器不允许跨源通信,并且它们提供了postMessage
API来安全地进行通信。
约束:我无法访问任何parent
或iframe
代码。
在浏览器控制台上,我想以某种方式访问iframe_variable
我尝试了以下内容:
首先获取iframe的参考。
var iframe = document.getElementsByTagName('iframe')[0]; // There is only one iframe on document
为message
窗口发布的parent
事件创建一个侦听器。
var iframeListener = function(e) {
console.log("Got message from parent");
e.source.postMessage(JSON.stringify({'IFRAME_VARIABLE': window.IFRAME_VARIABLE}));
}
为父窗口创建一个侦听器,以接受从iframe发布的“消息”。
parentListener = function(e) {
console.log('Got message from iframe');
var data = JSON.parse(e.data);
window.VARIABLE = data.IFRAME_VARIABLE;
}
将parent_listener
附加到message
事件。
window.addEventListener('message', parentListener, false);
现在,如果我尝试从iframe
向parent
发送消息,如下所示:
iframe.contentWindow.postMessage('test message', '*')
它不会触发'iframeListener'。原因是它未在iframe中针对message
事件进行注册。
当我在parent.com
时,我认为我甚至无法通过浏览器控制台执行此操作,因为任何尝试执行iframe.contentWindow.addEventListener
都会导致错误,因为它将尝试访问不同的领域。
有解决方法吗?在我的理解和研究中是否有任何我缺失的东西。
P.S:为简单起见,我没有写原点检查。我知道我必须检查发布消息的来源。不这样做会留下巨大的安全漏洞。