Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
安全地与客户打交道';会议';在PHP中_Php_Session - Fatal编程技术网

安全地与客户打交道';会议';在PHP中

安全地与客户打交道';会议';在PHP中,php,session,Php,Session,到目前为止,我一直在使用客户端cookie和数据库条目处理用户会话 当用户登录时,我生成一个guid并将其放在客户端计算机上的cookie中。然后我在“会话”MySQL表中创建一个条目,并在其中添加guid、ip地址、用户名、权限等。然后当用户访问页面时,我检查是否存在会话cookie。如果是这样,我会检查数据库中cookie中的guid,并确保ip地址匹配。如果是这样,则用户将使用db表中的其余信息登录。如果出现问题(ip地址错误、会话过期等),我将删除数据库条目并删除guid cookie

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

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

我以前从未使用过$\u全局会话


我的方式是良好的实践,还是我需要重新思考我是如何处理的

如果您需要以某种方式将当前用户链接到其他数据库信息,那么您现在这样做是很好的


为了简单起见,最好使用会话。我建议你在www.php.net/sessions上读一读,然后下定决心。它很容易使用,但不如使用数据库表灵活。您仍然可以设置所需的所有值,但是您必须在需要将它们用于数据库操作时获取它们并将它们插入查询中。

我认为您的做法是正确的。这实际上取决于应用程序的安全要求。您可以将$\u会话想象成与$\u COOKIE非常相似的机制:在页面刷新之间提供状态。在此上下文中,用户的身份。您的数据库应该提供进一步的身份验证机制。可以唯一标识用户的内容。一个典型的假设是IP地址,但是如果某人的IP发生了变化,会发生什么呢?用户代理是另一种可能性,但它们不是很独特


我建议您看看:

听起来您已经掌握了基本知识。但是,如果您是手动完成这些操作,那么您实际上只是实现了自己的
$\u会话
,而没有利用它已经可以为您完成所有这些操作的事实

如果要使用数据库处理会话,可以使用自己的数据库覆盖默认会话处理。看一看。我在我的应用程序中这样做

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();
您可以拥有您刚才描述的所有功能,这些功能都是您通过使用它自己实现的,但仍然可以使用$\u SESSION为您实现

例如,如果希望在启动会话之前添加IP检查以查看会话是否仍然有效,则可以将其作为“打开”函数的一部分添加。如果您想要将会话数据写入十个不同的数据库(不是您想要的),您可以通过“写入”函数来完成

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


您将看到会话id是传递给读/写/销毁函数的一个参数,您仍然可以使用GUID生成例程以相同的方式管理它。但是,您可以将guid生成和检查粘贴到此会话管理器类中,只需使用open()函数即可。集中,没有混乱,没有大惊小怪

我的朋友,你在重新发明轮子。我认为IP地址已经足够好了,特别是因为大多数人都在路由器后面,而且根据我的经验,除非路由器复位,否则IP通常不会刷新,通常还有一些内部机制来刷新IP。此外,即使用户的IP刷新是一个严重的因素,但这意味着用户必须重新登录——另外,在我自己的实现中,我通常会让会话在大约三四个小时后过期。这是非常正确的。我想的更多的是移动客户端。如果你的网站将被一部电话访问,如果那个人在路上,IP改变的可能性会大得多。尽管如此,对于大多数人来说,这通常只是web流量的一小部分。此外,如果您正在寻找与数据库的无缝$u会话集成,请查看Zend Framework的Zend_Auth组件。这是一个很好的观点,但我认为zombats会话处理程序类使会话的数据库部分更加无缝。