为什么新的Facebook Javascript SDK不违反“同源策略”?

时间:2010-10-24 03:18:34

标签: security facebook-graph-api same-origin-policy

新的Facebook Javascript SDK可让任何网站以Facebook用户身份登录并获取用户数据......

所以它将是,www.example.com包括来自Facebook的一些Javascript,但我记得,该脚本被认为是www.example.com的起源,无法从facebook.com获取数据,因为它是违反“同源政策”的。这不对吗?如果是这样,脚本如何获取数据?

3 个答案:

答案 0 :(得分:5)

从这里开始:https://developer.mozilla.org/en/Same_origin_policy_for_JavaScript

  

相同的原始政策阻止了   从一个加载的文档或脚本   得到或设置的起源   另一个文档的属性   起源。这项政策始终贯彻始终   回到Netscape Navigator 2.0。

并在此处略有不同解释:http://docs.sun.com/source/816-6409-10/sec.htm

  

相同的原产地政策有效   如下:从中加载文档时   一个来源,一个从一个脚本加载的脚本   不同的起源无法得到或设定   具体的具体属性   窗口中的浏览器和HTML对象   或框架(见表14.2)。

Facebook脚本不会尝试与您的域中的脚本进行交互或读取DOM对象。它只会自己发布到Facebook。它会获取您的站点名称,而不是通过与您的页面或您站点中的脚本进行交互,而是因为您填写表单以获取“喜欢”按钮时生成的脚本本身。我注册了一个名为“http://www.bogussite.com”的网站,并获得了放在我网站上的代码。这段代码中的第一个想法是

iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.bogussite.com&

所以脚本显然是通过iFrame链接中的硬编码网址参数获取您的网站信息。

到目前为止,Facebook的网站并不是唯一一个让您使用托管在其服务器上的脚本的网站。还有很多其他脚本以这种方式工作。例如,所有Google API(包括Google Gears,Google Analytics等)都要求您使用其服务器上托管的脚本。就在上周,当我试图弄清楚如何为我们的商店查找器为移动设备友好的Web应用程序进行地理定位时,我发现了一大堆地理定位服务,您可以使用托管在其服务器上的脚本,而不是复制脚本到你的服务器。

答案 1 :(得分:0)

我认为,但我不确定,他们使用iframe方法。至少用于canvas应用程序的跨域接收器和xfbml使用它。基本上,您网页上的javascript会在facebook.com域中创建一个iframe。 iframe然后有权使用facebook做任何需要的事情。与父对象的通信可以使用多种方法之一来完成,例如url hash。但我不确定他们使用哪种方法用于那部分。

答案 2 :(得分:0)

如果我记得,他们使用脚本标签插入。因此,当JS SDK调用需要调用Facebook时,它会在当前文档中插入<script src="http://graph.facebook.com/whatever?params...&callback=some_function脚本标记。然后Facebook以JSON格式返回数据some_function({...}),其中实际数据在...内。这导致函数some_function在example.com 的原点中被称为,使用来自graph.facebook.com的数据。