Google Friend Connect如何在不需要将文件上传到客户端域的情况下实现跨域通信?

时间:2009-10-07 22:01:51

标签: javascript cross-domain xss

以前,Google的Friend Connect要求用户将几个文件上传到他们的网站以启用跨域通信,而Facebook Connect仍然需要您上传单个文件才能启用它。

现在,Friend Connect不需要任何文件上传......我想知道他们是如何实现这一目标的。

参考: http://www.techcrunch.com/2009/10/02/easy-does-it-google-friend-connect-one-ups-facebook-connects-install-wizard/

5 个答案:

答案 0 :(得分:6)

在不同域上的文档之间有多种通信方式,其中包括HTML5 postMessage,NIX,FIM(散列/片段),frameElement以及使用window.name属性。

这些可在不同的浏览器和不同的版本中使用,但它们共同允许您进行可靠的XDM(跨域消息传递)。

之前完成此项目的一个项目是Apache Shindig,它可能开创了其中的一部分,最近,项目easyXDM已经出现,通过一个通用的API统一所有这些方法,使其变得简单使用XDM和RPC创建复杂的应用程序。

您可以在this article at Script Junkie中深入了解传输数据的各种方法。

现在,为了直接回答你的问题,早些时候很容易相信只有postMessage,FIM(片段标识符消息)可用,而后者有效工作,通常需要上传一个特殊的文件到你的域名。随着越来越多的方法被发现,许多方法已被弃用作为一种技术,因此;不再需要该文件。

仅供记录;我是Script Junkie文章和easyXDM库的作者(就像Twitter,Disqus和其他一些人正在使用的那样)。

答案 1 :(得分:4)

< edit>现在很难记住/验证,但我相信我的答案可能不正确。 Sean Kinsey上面的答案应该是这个问题的明确答案。如果您正在阅读此内容,请提出他的回答并忽略我的回答。< / edit>

Google Friend Connect小部件与大多数广告/小工具一样,使用HTML的复制/粘贴代码段来引用主机服务器上的JavaScript包含,然后创建包含所需内容的iframe。通过在网址中打开包含您网站ID的iframe,Google的服务器可以生成相应的HTML文档,以代表您特定网站/设置的Google朋友群小工具。

除了使用适当的URL目标创建iframe的初始步骤之外,没有任何跨站点通信发生。小工具动态生成的iframe中的所有内容更像是用户访问了Google服务器上的单独页面,但是显示的内容会嵌入/隔离在您网页上的某个块中。

答案 2 :(得分:0)

我不确定它在这个特定实例中是如何工作的,但是跨域消息传递可以通过postMessage()API完成,也可以通过更改URL的哈希部分并监视它来实现。

散列更改方法有效,因为封闭页面和封闭页面都可以访问随附页面的URL。

当然,希望postMessage()API调用随着时间的推移变得更加标准化。

答案 3 :(得分:0)

JSON允许跨域javascript。

  • 由于浏览器安全限制, 大多数“Ajax”请求都受制于 同源政策;请求 无法成功检索数据 来自不同的域,子域, 或协议。
  • 脚本和JSONP 请求不受相同的约束 原产地政策限制。

答案 4 :(得分:0)

除了使用somewindow.postMessage();进行跨域iframe之间的通信之外,没有其他方法。

somewindow.postMessage()之前,您必须上传文件,以确保您可以在iframe之间建立通信。

示例:

     <html>
<!-- this is main domain www.example.com -->
        <head>
        </head>
        <body>
      <iframe src="http://www.exampleotherdomain.com/">
      <script>
      function sendMsg(a) {

       var f = document.createElement('iframe'),
           k = document.getElementById('ifr');

           f.setAttribute('src', 'http://www.example.com/xdreciver.html#myValueisSent');
           k.appendChild(f);
           k.removeChild(f);
      }
      </script>


      <div id="ifr"></div>
      </iframe>
        </body>
        </html>

现在是http://www.example.com/xdreciver.html html内容:

     <html>
<!-- this is http://www.example.com/xdreciver.html -->
        <head>
      <script>
      function getMsg() {

             return window.location.hash;
      }
      </script>
        </head>
        <body onload="var msg = getMsg(); alert(msg);">



        </body>
        </html>

至于使用.postMessage();足以使用top.postMessage('my message to other domain document, which is also the main document', 'http://www.theotherdomain.com');