会话登录 - 如果数据库中不再存在用户,则销毁会话

时间:2013-04-02 07:50:46

标签: php mysql session

问题解释

我创建了第一个会话的登录信息。 基本上我有3个输入,2个字段,一个提交。

第一个字段是用户名,第二个字段是密码。

然后我使用PDO从用户表中选择用户名,密码WHERE = username,以验证详细信息。

然后我计算行数,看是否有一行指定用户名&密码。

很好,我现在已登录..

但是有问题 ..当我从数据库中删除用户时,我可以继续使用同一个用户在我的系统中浏览,直到会话结束或我退出。

问题

如何立即检查用户是否仍在数据库中? 每次用户进入新页面或刷新时,最好的方法是什么?

谢谢!

创建会话的代码(登录验证):

        # Selecting the entered username + password from our admins database & making sure field
        # with that specify username and password exists.
        $hashed = hash('sha512', md5($password));           
        $check = $CONNECT_TO_DATABASE->prepare("SELECT * FROM admin WHERE username = :username AND password = :password LIMIT 1");
        $check->bindValue(':username', $username);
        $check->bindValue(':password', $hashed);
        $check->execute();  

        # We check if that row exists, if it exists - We will create a new session with that entered
        # username, that means administrator has sucessfuly logged in.

        if ($check->rowCount()) {
            $_SESSION['user'] = $username;
            header ('Location: index.php');
        } else {

        # If login failed, because the details are wrong, we will store the error message into
        # our errors array and then use a loop to fetch the error.
            if (!empty($username) && !empty($password)) {
                $errors[] = 'Wrong username or password.';
            }
        }

然后我用它来查看用户是否已登录:

if (isset($_SESSION['user'])) {

3 个答案:

答案 0 :(得分:2)

您必须编写一个将在每个页面上运行的检查算法。此算法将在数据库中执行查询以检查用户是否仍然存在(请记住,您不能信任用户输入,会话就是这样)。如果查询结果为否定,则您将调用session_destroy()

根据您所遵循的应用程序设计和模式,您可以在所有页面中包含validate.php文件,也可以在控制器的构造函数中调用特定的AuthHelper类,以便为您执行此操作。< / p>

我会更多地强调这一点:你不能信任会话,因为他们是用户输入。 将自动检查用户是否存在的解决方案是以下算法:

  1. 当用户登录时,您在会话和数据库中的用户行中存储登录密钥(随机字母数字值)。
  2. 在您网站的每个受保护的页面上,检查数据库中是否存在具有会话登录密钥的行。如果它不是用户不再存在或者会话登录密钥已损坏。在这两种情况下,您都希望销毁会话,并将用户退出。

答案 1 :(得分:1)

您确实将userinfo传递并存储到会话,以便您可以使用存储的$_SESSION个变量。 然后使用SELECT语句执行数据库以检查存储的用户是否在 会话如果仍在您的数据库上,那么如果没有执行条件来销毁会话和 注销它们。

例如

$sql='SELECT * FROM USERS WHERE ID='.$_SESSION['user_id'].'';
$result = mysql_query($sql);

if(count($result)>0){
    echo 'User at database';

}
else{
   echo 'User not at database';
   session_destroy();
   // then redirect to homepage or login page.
}

答案 2 :(得分:1)

如果这是一个问题,请不要使用会话。听起来每次执行操作以验证用户是否仍然存在时都需要检查数据库,因此您每次都可以提取数据。这可能会引发一个关于加载的争论,但你可以缓存需要缓存的东西并重新拉动关键部分并验证其他部分。

如果您需要扩展,这也可以帮助您,因此您不必担心会话持久性。

相关问题