2012-12-21 83 views
2

我想添加一個「關閉其他活動會話」按鈕到我的PHP Web應用程序。「關閉其他會話」按鈕

我想跟蹤(用戶ID,會話ID,過期)上一個MySQL表的,殺會議方式如下:

$currentsessionid=session_id(); 
foreach($othersessions as $session){ 
    sessionid($session['sessionid']); 
    session_start(); 
    session_destroy(); 
} 
mysql_query("DELETE FROM sessions WHERE userid = $currentuserid AND sessionid <> $currentsessionid"); 
session_id($currentsessionid); 
session_start(); 

表也將各在session_start(更新後),如果用戶被記錄,刪除過期的條目。

過期的條目被刪除每次用戶登錄。

這是正確的做法?有什麼建議麼?

+0

我相信語言API應該提供一種方法來跟蹤服務器端的所有現有會話 – theMarceloR

+0

使用'DELETE'只會讓你知道用戶最後一次登錄,如果你想記錄日誌? – EmCo

+0

@theMarceloR:令人驚訝的是,我相信它沒有,我找不到它。 – NotGaeL

回答

2

在PHP中,會話通常是孤立的。您需要創建自己的會話處理程序,並將會話(以及一些額外的跟蹤信息)寫入數據庫,以便更容易管理。

例如,像你在你的問題,userid。然後您可以搜索特定用戶的會話。

您應該擁有的另一個字段是時間戳,以便您可以讓會話過期。如果超過X小時,則將其丟棄。

你可以 - 如果你喜歡 - 也看看用戶是否有一個現有的會話,並導入舊的會話。但是這可能會產生安全隱患。您需要考慮攻擊者登錄時發生的情況,而不是真正的用戶。

攻擊者甚至可以將有效用戶從系統中拋出嗎?這應該被阻止。

還要考慮到您可以在新會話ID下接管先前會話的會話數據。這與session_regenerate_id()類似,登錄應始終重新生成會話ID,以及註銷和其他重要步驟(例如,在更改電子郵件地址之前重新進行身份驗證)。

+0

那麼,時間戳是我提到的字段過期,當更改密碼或電子郵件時,reauth當然已經實現。此外,只有在註銷(它調用session_destroy())或新會話後纔會發生新的登錄,因爲當用戶已經通過身份驗證時調用登錄函數會引發異常,因此總是會有新的登錄名接收新的sessionid。那麼我想我正走在正確的軌道上。感謝您的意見。 – NotGaeL