2011-09-09 47 views
2

我有一个脚本,获取的Facebook用户的信息(见下文)。用户登录到其他人的帐户

我在测试过程中遇到的问题是,用户可以最终得到登录别人的账户。这显然是不受欢迎的。

这种情况发生在if($testuser != null)这一位,其中一些代码绕过用户名+密码阶段挂入网站的登录系统,并根据他们的电子邮件地址登录一个人。

我的猜测是,类似的事情是发生在支付系统我在几个月前固定。简而言之,如果两个人访问同一页面,他们最终都会从交易中受益。这是通过向支付服务的回叫添加一个id来解决的。在目前的情况下我不知道我怎么能实现这一点,但我要说的额外条件,需要在登录用户之前添加。

你觉得这是怎么回事,什么是一个合适的/安全修复?

$token_url = "https://graph.facebook.com/oauth/access_token?" 
     . "client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url) 
     . "&client_secret=" . $app_secret . "&code=" . $code; 

$response = file_get_contents($token_url); 
$params = null; 
parse_str($response, $params); 

$graph_url = "https://graph.facebook.com/me?access_token=" . $params['access_token']; 

$testuser = json_decode(file_get_contents($graph_url)); 

if($testuser != null){ 
    // Login code goes here 
    $id = get_userid_by_email($testuser->email); // Use email as key as unique 

    $user = new User($db); 

    $user->signin_by_id((int) $id); 
    $user->connect(); 
} 
+0

从FB读取部分看起来不错,我 - 我想看看'get_userid_by_email()'和'signin_by_id()',我猜。您的应用是否请求“获取电子邮件”权限?如果'$ testuser-> email =='''会发生什么?你究竟传递了哪些funcs?这是你认为你经过的吗? – Piskvor

+0

'get_userid_by_email'查询数据库中的id。如果'$ email'为空,它将返回一个-1,这又会导致一个检查来中断登录过程。 'signin_by_id'是实际用于登录的方法。它设置会话和cookie并初始化'User'实例的连接和id变量。该应用程序具有获取电子邮件许可权:'&scope = email'。 –

+1

好吧,如果它看似“随机”发生,我会开始记录'get_userid_by_email()'和'signin_by_id()'的执行。编写一个日志文件,说明它们在输入中接收的参数是什么以及输出是什么。希望这会给你带来一个可重现的问题。 您的'$ code'一代也有可能出现问题,并且正在被其他会话污染。我相信ID和电子邮件在数据库中是唯一的? – Naltharial

回答

1

是去检查get_userid_by_email数据库调用对于可能返回无效信息的任何潜在的漏洞。

你也需要确保$ testuser的是有效的。仅仅因为它解码数据并不意味着验证是正确的,因为Facebook可能已经返回了400错误代码。确保您检查数据中的错误索引。