首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Facebook即时个性化是如何运作的?

问Facebook即时个性化是如何运作的?
EN

Stack Overflow用户
提问于 2013-06-26 18:54:47
回答 3查看 406关注 0票数 2

我刚刚访问了http://www.tripadvisor.co.uk/,没有填写任何登录表单,它就知道我的身份,因为我登录了facebook。

我发现Trip是Facebook正在运行的一个名为“即时个性化”的项目的一部分。

我的问题是:这是如何工作的?幕后发生了什么事?我的浏览器发送的是什么?用什么方法(例如HTTP、iFrame、Ajax等)?

特别是,我以前曾想过,浏览器的跨域脚本安全规则使得这种事情不可能发生。我认为浏览器永远不会让exampleone.com上的脚本与exampletwo.com通信。

那么,tripadvisor.com如何能够访问我最初发送给facebook.com的信息呢?他们如何能够绕过跨域脚本规则?

PS -请不要告诉我,我可以禁用Facebook即时个性化。我已经知道我可以选择退出(在这个页面https://www.facebook.com/settings?tab=applications)。这是一个关于使即时个性化成为可能的技术的问题。

编辑--

一些人已经评论说,有人向facebook发送了一个请求,以获取我的详细信息。我同意必须这样做。但我想问的是,是如何将这个请求发送到facebook的?如果我访问tripadvisor.com,那么我就会主动告诉我的浏览器向tripadvisor.com发出请求。不是对facebook.com。我认为运行在tripadvisor.com上的脚本将被浏览器阻止与facebook.com通信。

我觉得这非常令人不安。如果tripadvisor知道我的身份,那么他们的服务器可能会通知facebook服务器我查看的页面。在tripadvistor和facebook的具体案例中,我不太在意这个问题。我怀疑这些数据只会被用来更好地瞄准他们展示给我的广告。够无害的..。

但是,如果我的在线身份可以在这样的域名之间传递,而我却不知道,在我之前认为是不可能的情况下,那就意味着可能会有其他网站将这种技术用于恶意目的。所以我想了解发生了什么,了解我到底接触到了什么。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-06-27 00:02:48

下面是关于幕后发生的事情的一个简短的技术解释:

在tripadvisor加载页面时,它向Facebook发出请求,突出显示如下:

​

​

请求包含来自tripadvisor的特定ID和一些定义返回内容的参数。Facebook验证请求,并返回一个只访问您的公共信息的应用程序的访问令牌。这个标记只给他们的伙伴。

您的客户端总是可以向外部域发出HTTP请求!这是CDN和多个其他web实现的工作方式。当您从正在为您当前浏览的页面内容提供服务的服务器上检索不包含的外部源图像时,这是一个不违反跨域策略的外部请求。

脸谱网的答复载于:

代码语言:javascript
复制
xd_arbiter.php?version=25

在客户端执行的是javascript代码,我认为它允许tripadvisor检索您的公共信息。

Tripadvisor并不需要访问您的cookie或违反跨域安全措施,所有的事情都发生在服务器端上的Facebook前端上。一旦Facebook验证了请求的源(即确保域属于其程序合作伙伴之一),它就会向请求提供所需的数据。

如果您试图访问tripadvisor范围外的URL,则会得到以下内容:

​

​

进一步阅读:

1.3.2来自OAuth规范文档的隐式格兰特流:

隐式授权是为在浏览器中使用脚本语言(如JavaScript )实现的客户端优化的简化授权代码流。在隐式流中,客户机不是向客户机发出授权代码,而是直接向客户机发出访问令牌(这是资源所有者授权的结果)。授予类型是隐式的,因为没有颁发中间凭据(例如授权代码)(稍后用于获取访问令牌)。

https://datatracker.ietf.org/doc/html/draft-ietf-oauth-v2-28#page-8

票数 1
EN

Stack Overflow用户

发布于 2013-06-27 02:12:23

好的,谢谢你帮我做这个@BassemDy -你给了我90%的答案,而我刚刚算出了我错过的另外10%。

我可以看到tripadvisor可以让我的浏览器在不违反任何跨域规则的情况下向facebook发送请求。正如BassemDy所指出的,当您从外部域加载图像,或者从某个外部域加载共享脚本(如google等)时,这种情况一直在发生。

我不明白的是,tripadvisor是如何让我的浏览器向facebook发送请求的,然后facebook可以识别我。

然后我想到了答案。当然tripadvisor的脚本不能直接读我的facebook cookie..。但是当我的浏览器向facebook提出跨域请求时,我的浏览器会将我的facebook cookie发送到facebook。那是我错过的部分。

然后facebook可以以tripadvisor的脚本所能读到的某种方式进行响应,因此tripadvisor的脚本可以确定我的身份。

所有使用OAuth和令牌的业务只是使上述过程安全的一种方式。实际上,tripadvisor可以让我把我的facebook饼干发送到facebook。

作为概念的证明,我在我控制的两个不同域上运行了以下测试脚本:

论domainone.com - login.php

代码语言:javascript
复制
<?php setcookie('yourname','Daniel Howard',0,'/');
exit;

论domainone.com - responder.php

代码语言:javascript
复制
<?php header('Content-type: text/javascript'); ?>
window.cookieFromDomainone = <?= json_encode($_COOKIE) ?>;
window.updateMe();

然后在domaintwo.com - test.php上

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body>
<p id="identityFromDomainone"></p>
<script type="text/javascript">
    window.updateMe = function() {
        document.getElementById('identityFromDomainone').innerHTML = window.cookieFromDomainone.yourname;
    };
</script>
<script src="http://domainone.com/responder.php" ></script>
</body>
</html>

首先,我访问domainone.com/login.php,并设置一个包含我名字的cookie。当你登录到facebook时,类似的事情会发生。

然后访问domaintwo.com/test.php

它无法阅读我的domainone.com曲奇。但是它使我的浏览器向domainone.com和发送请求,我的浏览器将随请求一起发送我的domainone.com cookie。然后,在domainone.com/responder中,将cookie值输入一些返回的javascript,并在domaintwo.com上执行。

执行的javascript使我的身份在domaintwo.com上可用。当我的名字出现在p元素中时,就说明了这一点。

我感到非常震惊的是,编写代码是多么容易,这些代码基本上会向任何想要用户身份的网站吐露用户身份。我想知道在野外有多少写得不好的单一登录尝试等待被利用.希望facebook和他们的好友使用的OAuth系统是安全的。

票数 2
EN

Stack Overflow用户

发布于 2013-06-26 19:05:19

我有一种预感--这与OAuth密切相关--也许它会自动检查当前登录令牌,然后启动OAuth登录。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17328227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档