安全地处理PHP中的客户端“会话”

时间:2009-12-11 23:13:50

标签: php session

我(到目前为止)一直在使用客户端cookie和数据库条目处理用户会话。

当用户登录时,我生成一个guid并将其放在客户端计算机上的cookie中。然后我在'sessions'表中创建一个条目,并在那里添加guid,ip地址,用户名,权限等。然后当用户访问页面时,我检查是否有会话cookie。如果是这样,我检查数据库中的guid在cookie中,并确保IP地址匹配。如果是,则用户使用db表中的其余信息登录。如果出现问题(错误的IP地址,过期的会话等),我会删除数据库条目并删除guid cookie。

我之前从未使用过$ _SESSION全球。

我的方式是好的做法还是我需要重新思考我是如何处理这个的?

3 个答案:

答案 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发生变化会发生什么?用户代理是另一种可能性,但这些并不是非常独特。

我建议您查看:http://php.net/manual/en/session.security.php