2011-05-09 58 views
4

我一直抱怨用戶互相登錄。他們甚至可以編輯他們的個人資料併發布他們......這顯然是一個巨大的問題。甚至沒有註冊的人正在訪問該網站,並看到他們是以其他人的身份登錄的。使用PHP會話登錄到隨機用戶帳戶的人

這發生在Safari和Firefox

當人們登錄使用$_SESSION['variable'] = name;系統,所以很標準我會話設置。會話使用的是跨子域:

ob_start(); 
session_set_cookie_params(0, '/', '.subverb.net'); 
session_start(); 

在我的所有頁面的標題中。

我有一個iframe持有中也包含了相同的標題

我不知道還有什麼其他的信息,我可以給,所以請詢問網站的聊天部分。我真的需要這個來排序,但不確定問題是什麼!

感謝


針對以下:

標準的登錄腳本是由拉里·厄爾曼教科書直線上升:

if ($un && $p) { // If everything's OK. 

    // Query the database. 
    $query = "SELECT member_id, member_firstname, member_type, username FROM member WHERE (username='$un' AND password=SHA('$p')) AND active IS NULL"; 

    $result = mysqli_query ($dbc, $query) or trigger_error ("query: $query\n<br />MySQL Error: " . mysqli_error($query)); 

    if (@mysqli_num_rows($result) == 1) { // A match was made. 

     // Register the values & redirect. 
     $row = mysqli_fetch_array($result, MYSQLI_ASSOC); 
     mysqli_free_result($result); 

     $_SESSION['member_id'] = $row['member_id']; 
     $_SESSION['first_name'] = $row['member_firstname']; 
     $_SESSION['member_type'] = $row['member_type']; 
     $_SESSION['username'] = $row['username']; 

Facebook登錄腳本執行以下操作:

$query = "SELECT * FROM member WHERE oauth_prov = 1 AND fb_userid = ".$user['id']; 
    $result = mysqli_query ($dbc, $query) or trigger_error ("query: $query\n<br />MySQL Error: " . mysqli_error($dbc)); 


    if(mysqli_num_rows($result) == 1) { 



    while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {; 


    $_SESSION['first_name'] = $row['member_firstname']; 
    $_SESSION['member_id'] = $row['user_id']; 
    $_SESSION['oauth_uid'] = $row['fb_userid']; 
    $_SESSION['username'] = $row['username']; 

所有輸入都已過濾,用戶無法通過其他方式添加詳細信息。用戶名和密碼是正常添加的,通過點擊執行該腳本的鏈接可以從Facebook獲得Facebook標識。

這些錯誤在登錄時發生得很好,甚至登錄時甚至沒有發生。沒有其他地方會話值設置在網站上。

+0

會話ID是否附加到URL?這可能會導致會話超時。 – 2011-05-09 17:11:40

+0

不是。你的意思是當他們登錄或在其他地方?就我所知,沒有任何內容在他們登錄(或其他任何地方)時附加到URL上。只需將user_id和用戶名添加到$ _SESSION登錄 – 2011-05-09 17:16:35

+3

您是否使用任何形式的緩存?如果頁面在用戶登錄時被緩存,那麼可能會導致類似的問題。 – Thilo 2011-05-09 17:42:31

回答

3

我會檢查數據庫例程,將用戶記入日誌中。你確定它是選擇適當的用戶,只有適當的用戶?您是否測試過您的select語句是否不受不同用戶輸入場景的影響?鑑於它持續在頁面加載,它幾乎肯定是一個$_SESSION問題。假設您在登錄時加載關於用戶的信息,那麼隨之而來的問題是登錄時$_SESSION變量的初始人口。因此,您一定要檢查登錄腳本以確保其穩定。

您可能需要發佈登錄腳本的其他部分,因此我們可以檢查它是否存在漏洞/問題。

+0

它不會讓我回答我自己的問題,爲另一個8小時,但我的腳本需要一個用戶名和密碼,並檢查數據庫返回:成員類型,成員id和用戶名,並將它們添加到會話變量。所有的輸入都經過了消毒處理(正常的登錄是從相當受歡迎的長時間運行的教科書中解除的,所以我很有信心它是合適的) – 2011-05-09 18:27:34

+0

我不知道這是如何成爲登錄腳本的,過去的日誌記錄,甚至當用戶還沒有訪問過登錄頁面時 – 2011-05-09 18:27:43

+0

您不必將它作爲答案,只需編輯您的原始帖子。第二個問題,我澄清了我的答案,以更好地解釋,但它是否發生過以前從未登錄過的人(即,從未在他們的計算機上設置過Cookie)? – eykanal 2011-05-09 18:30:00

1

也許在會話ID有衝突嗎?這將解釋隨機部分。爲了防止這種情況發生,請將IP存儲在會話中,並在IP更改時拋出「Sorry」頁面。你有很多遊客嗎?

+0

此刻不是很多沒有,只是剛剛推出。會不會將會話存儲在數據庫中? – 2011-05-09 18:03:42

+0

然後碰撞不應該是原因:(將數據存儲在數據庫中可能無法解決此問題,因爲它似乎是您的會話ID或會話設置的問題。 – 2011-05-09 18:13:30

0

你有沒有在這方面得出一個堅實的結論?

聽起來像登錄腳本,雖然錯誤是不可能的,因爲它的隨機性質?