在PHP中使用会话和cookie

在PHP中使用会话和cookie,php,session,cookies,session-cookies,Php,Session,Cookies,Session Cookies,在登录期间,我使用以下功能设置cookies和会话 protected function validateUser($userid, $ckey=0, $rememmber=0) { session_start(); session_regenerate_id(true); //this is a security measure $_SESSION['user_id'] = $userid; $_SESSION['HTTP_USER_AGENT'] = md5(

在登录期间,我使用以下功能设置cookies和会话

protected function validateUser($userid, $ckey=0, $rememmber=0) {
    session_start();
    session_regenerate_id(true); //this is a security measure
    $_SESSION['user_id'] = $userid;
    $_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']);
    if (isset($remember) && $rememmber == 'on') {
        setcookie("user_id", $_SESSION['user_id'], time() + 60 * 60 * 24 * COOKIE_TIME_OUT, "/");
        setcookie("user_key", sha1($ckey), time() + 60 * 60 * 24 * COOKIE_TIME_OUT, "/");
    }
    return true;
}
然后在安全用户页面上,检查
user\u id
使用user\u id从数据库中获取有关用户的所有重要数据

public function protect() {
        session_start();

        /* Secure against Session Hijacking by checking user agent */
        if (isset($_SESSION['HTTP_USER_AGENT'])) {
            if ($_SESSION['HTTP_USER_AGENT'] != md5($_SERVER['HTTP_USER_AGENT'])) {
                $this->signout();
                exit;
            }
        }

// before we allow sessions, we need to check authentication key - ckey and ctime stored in database

        /* If session not set, check for cookies set by Remember me */
        if (!isset($_SESSION['user_id'])) {
            if (isset($_COOKIE['user_id']) && isset($_COOKIE['user_key'])) {
                /* we double check cookie expiry time against stored in database */

                $cookie_user_id = $_COOKIE['user_id'];
                               $stmt = $this->db->prepare("select `ckey`,`ctime` from `users` where `id` =?") or die($this->db->error);
            $stmt->bind_param("i", $cookie_user_id) or die(htmlspecialchars($stmt->error));
            $stmt->execute() or die(htmlspecialchars($stmt->error));
            $stmt->bind_result($ckey, $ctime) or die($stmt->error);
            $stmt->close() or die(htmlspecialchars($stmt->error));
                // coookie expiry
                if ((time() - $ctime) > 60 * 60 * 24 * COOKIE_TIME_OUT) {
                    $this->signout();
                }
                /* Security check with untrusted cookies - dont trust value stored in cookie.       
                  /* We also do authentication check of the `ckey` stored in cookie matches that stored in database during login */

                if (!empty($ckey) && is_numeric($_COOKIE['user_id']) && $_COOKIE['key'] == sha1($ckey)) {
                    session_regenerate_id(); //against session fixation attacks.

                    $_SESSION['user_id'] = $_COOKIE['user_id'];
                    $_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']);
                } else {
                    $this->signout();
                }
            } else {
                if ($page != 'main') {
                    header('Location:' . wsurl);
                    exit();
                }
            }
        }
    }

我想知道,为了安全起见,这是否足以在cokkies和session中只存储用户id和用户代理?如果没有,还有什么?

会话存储在服务器上,并且您已经在登录后立即重新生成会话密钥,因此我认为您只需存储用户代理和用户id即可。但是,我不会在每次安全页面查看后重新生成会话id(例如,删除
会话\u重新生成\u id()
来自
validateUser()
函数)。维基百科建议登录后只做一次。。。除此之外的任何事情都有点失控。我也会将
session\u start()
从函数中移出,并在代码中的一个很好的位置上移到顶部


祝你好运

会话存储在服务器上,并且您已经在登录后立即重新生成会话密钥,因此我认为您只需存储用户代理和用户id就可以了。但是,我不会在每次安全页面查看后重新生成会话id(例如,从
validateUser()中删除
会话重新生成id()
功能)。维基百科建议登录后只做一次。。。除此之外的任何事情都有点失控。我也会将
session\u start()
从函数中移出,并在代码中的一个很好的位置上移到顶部

$rs_ctime = $this->db->query("select `ckey`,`ctime` from `users` where `id` = -> '$cookie_user_id'<-")

祝你好运

$rs\u-ctime=$this->db->query(“从`users`中选择`ckey`,`ctime`,其中`id`=->'$cookie\u-user\u-id'
$rs\u-ctime=$this->db->query(”从'users'中选择'ckey','ctime',其中'id`=->'$cookie\u user\u id'您可能希望向会话中添加令牌以防止CSRF:您不应该在cookie中存储敏感数据,例如用户id,始终使用会话。@animuson那么,如何记住用户?这只是用户id。它不像密码或密码anything@AuthmanApatira是的,我是agree与您一起。这只是一些数字。animuson请解释您的想法。您可能希望在会话中添加令牌以防止CSRF:您不应该将敏感数据(如用户ID)存储在cookie中,始终使用会话。@animuson那么,如何记住用户?这只是用户ID。它不像密码或密码anything@AuthmanApatira是的,我同意你的看法。这只是一些数字。animuson请解释你的想法。protect()位于每个用户页的顶部。因此会话_start将位于顶部)protect()位于每个用户页的顶部。因此,会话_start将位于顶部)
$rs_ctime = $this->db->query("select `ckey`,`ctime` from `users` where `id` = -> '$cookie_user_id'<-")