6

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

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

4

3 回答 3

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 链接中的硬编码 URL 参数获取您的站点信息。

Facebook 的网站并不是唯一一家让您使用托管在其服务器上的脚本的网站。还有很多其他的脚本以这种方式工作。所有的谷歌 API,例如,包括谷歌齿轮、谷歌分析等,都要求你使用托管在他们服务器上的脚本。就在上周,当我试图弄清楚如何为我们的商店查找器为一个适合移动设备的网络应用程序进行地理定位时,我发现了一大堆地理定位服务,它们让你使用托管在他们服务器上的脚本,而不是复制脚本到你的服务器。

于 2010-10-24T03:30:23.803 回答
0

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

于 2010-10-24T03:37:05.747 回答
0

我认为,但不确定,他们使用 iframe 方法。至少画布应用程序的跨域接收器和 xfbml 东西使用它。基本上,您页面上的 javascript 在 facebook.com 域中创建了一个 iframe。然后,该 iframe 有权对 facebook 执行任何所需的操作。可以使用多种方法中的一种来与父级进行通信,例如 url 哈希。但我不确定他们在这部分使用了哪种方法。

于 2010-10-24T03:24:34.733 回答