2010-12-13 81 views
6

導航到Facebook社交網絡時,我看到我可以打開2個帳戶(1個在Firefox中,另一個在Internet Explorer中)或者可能有多個帳戶。知道Facebook政策只允許同時打開一個會話,這並不是很好。如何防止會話

在啓動會話時,如何防止在另一個瀏覽器(Internet Explorer/Safari/Opera ...)中重新打開同一會話(考慮會話名稱$_SESSION['user'])?

否則,我怎麼知道(使用PHP)某個會話在所有瀏覽器中打開以防止會話被打開兩次?

+2

存儲用戶的IP,如果他們有會話或沒有,然後檢查IP? – 2010-12-13 17:00:43

+4

我想到的第一件事是在用戶表中有一個LoggedIn布爾標誌。 – Ben 2010-12-13 17:03:06

+0

@火箭,謝謝+1,我從來沒有想到過,但IP地址似乎比本的回答更難,@Ben,這是一個有用的方式(我會用它+1):謝謝大家! – SmootQ 2010-12-13 17:09:00

回答

2
$token = hash('sha256', rand() . microtime() . $_SERVER['REMOTE_ADDR']) // rand as possible 
$_SERVER['user'] = $token; 
+1

我很抱歉,但我無法很好地理解此代碼,是關於服務器變量的嗎? – SmootQ 2010-12-13 17:15:13

+0

Okey,創建一個將使用用戶名的服務器變量,對吧? – SmootQ 2010-12-13 17:16:14

+1

我以前使用過這種方法。基本上當用戶登錄時,創建一個名爲「user_」的服務器變量+他們的用戶名(例如:「user_simotaqi」),它具有基於登錄時間等的值,並將其存儲在用戶的會話中。頁面加載時,確保它們匹配 – 2010-12-13 17:33:21

1

而不是防止一個新的會話從一個新的瀏覽器被打開,如果有已經是一個公開會議上的其他地方,可以考慮無效任何現有會話到用戶帳戶時,一個新的登錄會出現。這將最大限度地減少用戶的挫折感,並且易於實現。

+0

謝謝你回憶我這個問題,我會檢查其他瀏覽器如果用戶數據庫字段(logedIn)已經= yes,那麼我會將此用戶ID傳遞給會話,謝謝+1 – SmootQ 2010-12-13 17:13:26

+0

@Simo - 但這似乎不可靠。我會在發生登錄時簡單地清除/清除所有會話數據(針對特定用戶),併爲最新登錄創建新的會話數據。 – karim79 2010-12-13 17:14:50

+0

但是,如果您在用戶登錄時終止/清除所有會話數據並創建新會話數據,則此會話將僅在登錄時使用的瀏覽器中打開 – SmootQ 2010-12-13 17:19:37