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

Car*_*ers 5 php session

我(到目前为止)已经使用客户端cookie和数据库条目处理用户会话.

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

我之前从未使用过$ _SESSION全局.

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

zom*_*bat 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();
Run Code Online (Sandbox Code Playgroud)

您可以使用此功能获得您刚才描述的所有功能,但仍然具有$ _SESSION的功能为您完成.

例如,如果您想在启动之前添加IP检查以查看会话是否仍然有效,则可以将其添加为"打开"功能的一部分.如果您想将会话数据写入十个不同的数据库(不是您想要的),您可以在"写入"功能中完成此操作.

这些函数都是根据你如何使用$ _SESSION来使用的,通过将它们放入一个简单的类中,你可以非常有效地管理它的工作方式.

您将看到会话ID是传递给读/写/销毁函数的参数,您仍然可以使用GUID生成例程以相同的方式管理它.但是,你可以坚持guid生成并检查这个会话管理器类,只需让open()函数执行它们.集中,没有麻烦,没有大惊小怪.