你如何跨域使用window.postMessage?

时间:2010-08-11 10:29:04

标签: javascript html5 google-chrome xss

似乎window.postMessage的要点是允许在不同域上托管的窗口/框架之间进行安全通信,但实际上似乎允许在Chrome中。

以下是该方案:

  1. 嵌入< iframe> (在域A的页面中,域名B * 上有src
  2. < iframe>最终主要是< script>标签,在执行结束时......
  3. 我调用window.postMessage( some_data page_on_A
  4. < iframe>绝对是在域B的上下文中,我已经确认了那个< iframe>中的嵌入式javascript。正确执行并使用正确的值调用postMessage

    我在Chrome中收到此错误消息:

      

    无法将讯息发布到 A 。   收件人起源 B

    这是在A:

    页面中注册消息事件监听器的代码
    window.addEventListener(
      "message",
      function (event) {
        // Do something
      },
      false);
    

    我也试过调用window.postMessage(some_data, '*'),但所有这一切都是为了抑制错误。

    我只是忽略了这一点,是window.postMessage(...)不是为了这个吗?或者我只是做得非常糟糕?

    * Mime-type text / html,必须保留。

3 个答案:

答案 0 :(得分:73)

以下是适用于Chrome 5.0.375.125的示例。

页面B(iframe内容):

<html>
    <head></head>
    <body>
        <script>
            top.postMessage('hello', 'A');
        </script>
    </body>
</html>

请注意top.postMessageparent.postMessage使用window.postMessage

页面A:

<html>
<head></head>
<body>
    <iframe src="B"></iframe>
    <script>
        window.addEventListener( "message",
          function (e) {
                if(e.origin !== 'B'){ return; } 
                alert(e.data);
          },
          false);
    </script>
</body>
</html>

A和B必须类似于http://domain.com

修改

another question开始,它看起来域(此处的A和B)必须/才能使postMessage正常工作。

答案 1 :(得分:20)

您应该在加载后将消息从帧发布到父级。

框架脚本:

$(document).ready(function() {
    window.parent.postMessage("I'm loaded", "*");
});

在父母那里听:

function listenMessage(msg) {
    alert(msg);
}

if (window.addEventListener) {
    window.addEventListener("message", listenMessage, false);
} else {
    window.attachEvent("onmessage", listenMessage);
}

使用此链接获取更多信息:http://en.wikipedia.org/wiki/Web_Messaging

答案 2 :(得分:2)

您可能尝试将数据从mydomain.com发送到www.mydomain.com或反向,注意您错过了“www”。 http://mydomain.comhttp://www.mydomain.com是与javascript不同的域。