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();
}
從FB讀取部分看起來不錯,我 - 我想看看'get_userid_by_email()'和'signin_by_id()',我猜。您的應用是否請求「獲取電子郵件」權限?如果'$ testuser-> email =='''會發生什麼?你究竟傳遞了哪些funcs?這是你認爲你經過的嗎? – Piskvor
'get_userid_by_email'查詢數據庫中的id。如果'$ email'爲空,它將返回一個-1,這又會導致一個檢查來中斷登錄過程。 'signin_by_id'是實際用於登錄的方法。它設置會話和cookie並初始化'User'實例的連接和id變量。該應用程序具有獲取電子郵件許可權:'&scope = email'。 –
好吧,如果它看似「隨機」發生,我會開始記錄'get_userid_by_email()'和'signin_by_id()'的執行。編寫一個日誌文件,說明它們在輸入中接收的參數是什麼以及輸出是什麼。希望這會給你帶來一個可重現的問題。 您的'$ code'一代也有可能出現問題,並且正在被其他會話污染。我相信ID和電子郵件在數據庫中是唯一的? – Naltharial