我(到目前为止)一直在使用客户端cookie和数据库条目处理用户会话。
当用户登录时,我生成一个guid并将其放在客户端计算机上的cookie中。然后我在'sessions'表中创建一个条目,并在那里添加guid,ip地址,用户名,权限等。然后当用户访问页面时,我检查是否有会话cookie。如果是这样,我检查数据库中的guid在cookie中,并确保IP地址匹配。如果是,则用户使用db表中的其余信息登录。如果出现问题(错误的IP地址,过期的会话等),我会删除数据库条目并删除guid cookie。
我之前从未使用过$ _SESSION全球。
我的方式是好的做法还是我需要重新思考我是如何处理这个的?
答案 0 :(得分:7)
听起来你已经掌握了基础知识。但是,如果你手动完成所有操作,那么你实际上只是实现了自己的$_SESSION
,而没有利用它可以为你完成所有这些事实。
如果要使用数据库来处理会话,可以使用自己的会话覆盖默认会话处理。看看session_set_save_handler()。我在我的应用程序中执行此操作。
class SessionHandler
{
public function open($save_path, $session_name)
{
$this->sessionName = $session_name;
return(true);
}
public function close() {
//stuff
}
public function read($id) {
$expiretime = date("Y-m-d H:i:s",time() - $this->maxLifeTime);
$sql = "SELECT * FROM sessions where sessionid='".$this->db->escapeData($id)."' AND lastupdated>='".$expiretime."' LIMIT 1";
$result = $this->db->query($sql);
//etc.
}
//etc.
public function setAsSessionHandler()
{
session_set_save_handler(
array($this,'open'),
array($this,'close'),
array($this,'read'),
array($this,'write'),
array($this,'destroy'),
array($this,'gc')
);
}
}
$sessionHandler = new SessionHandler();
$sessionHandler->setAsSessionHandler();
您可以使用此功能获得您刚才描述的所有功能,但仍然可以使用$ _SESSION为您完成此功能。
例如,如果您想在启动之前添加IP检查以查看会话是否仍然有效,则可以将其添加为“打开”功能的一部分。如果你想将会话数据写入十个不同的数据库(不是你想要的),你可以在'write'函数中完成这个。
这些函数都是根据你如何使用$ _SESSION来使用的,并且通过将它们放入一个简单的类中,你可以非常有效地管理它的工作方式。
您将看到会话ID是传递给读/写/销毁函数的参数,您仍然可以使用GUID生成例程以相同的方式管理它。但是,你可以坚持guid生成并检查这个会话管理器类,只需让open()函数执行它们。集中,没有麻烦,没有大惊小怪。
答案 1 :(得分:1)
如果你以某种方式需要将当前用户链接到其他数据库信息,那么你现在的做法很好。
为简单起见,使用会话是首选方法。我建议你在www.php.net/sessions上阅读一下这篇文章并从中做出决定。它非常易于使用,但它不如使用数据库表灵活。您仍然可以设置所需的所有值,但是只要需要将它们用于数据库操作,就必须获取它们并将它们插入到查询中。
答案 2 :(得分:1)
我认为你走在正确的轨道上。它实际上取决于您的应用程序的安全性要求。您可以认为$ _SESSION与$ _COOKIE非常相似:作为在页面刷新之间提供状态的机制。在此上下文中,您的用户的身份。您的数据库应该提供进一步的身份验可能唯一标识您的用户的事情。一个典型的假设是IP地址,但是如果某些IP发生变化会发生什么?用户代理是另一种可能性,但这些并不是非常独特。