2010-10-24 1450 views
5

新的Facebook Javascript SDK可以让任何网站以Facebook用户身份登录并获取用户的数据...为什么新的Facebook Javascript SDK不违反“同源策略”?

因此,www.example.com会包含一些来自Facebook的Javascript,但我记得,该脚本被认为是www.example.com的来源,并且无法从facebook.com获取数据,因为这违反了“同源策略”。这不正确吗?如果是这样,脚本如何获取数据?

+1

我认为同样的出处政策是,如果HTML页面来自www.foo.com,并且它包含www.bar.com上的脚本,那么使用Javascript获取数据仅限于www.foo.com,但是没有任何其他地方。 – 2010-10-24 04:05:30

回答

0

我想,但我不确定,他们使用iframe方法。至少跨域接收器和用于canvas应用的xfbml东西使用它。基本上你的页面上的JavaScript在facebook.com域内创建一个iframe。该iframe然后有权执行任何需要与Facebook。与父母的沟通可以通过几种方法之一完成,例如URL散列。但我不确定他们是否使用该方法。

+0

这不是它的iFrame。在我的答案中看到第二个引号。 iFrame仍然会受限于与父页面上的脚本进行交互。 – David 2010-10-24 03:45:26

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& 

所以脚本显然是让您的网站信息被硬编码URL参数的链接的iFrame。

Facebook的网站到目前为止并不孤单,因为您使用托管在其服务器上的脚本。有很多其他脚本以这种方式工作..例如,包括Google Gears,Google Analytics等在内的所有Google API都需要使用托管在其服务器上的脚本。就在上周,当我试图找出如何为适合移动设备的网络应用程序的商店查找工具进行地理位置定位时,我发现了一大堆地理定位服务,它们使用托管在其服务器上的脚本,而不是复制脚本到您的服务器。

+1

hm,我正在看''方法......它如何出现在example.com上并从facebook.com获取数据。当它是iframe方法时,iframe属于域名facebook.com,因此它可以访问facebook.com并获取任何数据。 – 2010-10-24 04:02:44

+0

因为它不违反相同原产地规则的规则。它不从主页面访问脚本,也不访问主页面上的DOM元素。它只是在另一台服务器上的页面上发布帖子。相同的原产地政策并不妨碍这一点。 (如果它是DID,就不会有CSRF攻击这样的事情)。如果它试图从页面上的脚本读取变量数据并将其传递给Facebook,或者从表单元素中读取数据并将该数据传递给Facebook,则会出现违规。 – David 2010-10-24 04:07:24

0

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