2010-12-13 76 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