2011-09-09 96 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錯誤代碼。確保您檢查數據中的錯誤索引。