0

问题说明

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

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

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

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

太好了,我现在登录了..

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

问题

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

谢谢!

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

        # 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'])) {
4

3 回答 3

2

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

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

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

  1. 当用户登录时,您将登录密钥(随机字母数字值)存储在数据库中的会话和用户行中。
  2. 在您网站的每个受保护页面上,您检查数据库中是否存在带有会话登录密钥的行。如果不是,则用户不再存在或会话登录密钥已损坏。在这两种情况下,您都想销毁会话并将用户注销。
于 2013-04-02T07:54:41.663 回答
1

您实际上将用户信息传递并存储到会话,以便您可以使用$_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.
}
于 2013-04-02T07:54:13.787 回答
1

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

如果您必须进行扩展,这也将对您有所帮助,因此您不必担心会话持久性。

于 2013-04-02T07:55:02.280 回答