2010-08-21 108 views
3

我在这里对于应该如何处理会话存在一些疑虑。使用PHP会话ID,cookie +数据库跟踪用户

现在,我有一个MySQL数据库,其中“users”表有一个session_id字段。如果为NULL,用户没有登录?如果该值与PHPSESSID cookie的值相同,则会比用户登录的值更大。

我不知道为什么,但我总觉得这不够好,以确保哪个用户是我的正在处理。有什么我想念的,或者我的恐惧没有根据?

回答

2

就我所知,您描述的内容没有任何实质性错误。

当然,登录和注销机制需要在登录或注销时可靠地添加和删除用户标识。 (仅在密码匹配时插入用户名等)。此外,过期的会话需要可靠地移除。如果这是给出的,这应该没问题。

+0

是的,注销包括销毁会话cookie并将会话字段设置为NULL,以及销毁服务器端会话。 – KdgDev 2010-08-21 22:01:30

2

只是Pekka说的扩展,你也可以在你的表中包含一个'last seen'字段并用它作为判断,因为Pekka提到过期会话时,你的数据库不会被告知他们已经不在了。所以你将不得不做一些事情,以便手动检查用户最后一次在那里或者沿着这些线路做什么,然后将它映射回会话超时(我相信这对于PHP来说默认是15-30分钟),并且然后在所述时间量之后,清除在最近X分钟内没有活动的任何用户。

1

想到上述选项 - 跟踪用户表中的用户只会允许每个用户1个会话。我建议将数据存储在称为会话的表格中,并具有以下列:

sess_id | sess_userid | sess_ipv4 | sess_lastseen(datetime/timestamp)| sess_sessionid(varchar)

我相信这将允许用户有多个登录名,但具有不同的会话ID,即使他们共享相同的公共IP,允许笔记本电脑,平板电脑,手机等 - 这样你可以跟踪每个设备与单个用户分开。

希望这有助于!

上周读过的另一篇文章建议做一个prevsession和currsession,并确保你将一个新的会话(每15分钟?)分配给正确的用户。 。将会话从旧的交换到新的会话并将prev会话存储为支票 - 不知道这是否会有所帮助,但认为id会提及它。