每页上的登录验证询问数据库

时间:2019-11-15 08:44:12

标签: php mysql security authentication

我正在用PHP创建一个安全的登录系统。
在管理区域的每个页面上,我要确保用户已正确登录,他的帐户仍处于启用状态,该用户及其登录详细信息已连接一次(当用户首次登录时,active_user状态设置为1)。

function isCookieValid() {
    global $pdo;

    $isValid = false;
    if(isset($_COOKIE["rememberUser"])) {

        $decryptCookie = base64_decode($_COOKIE["rememberUser"]);
        $user_id = explode("mMUa26yB943jRaJl755OM18jgR", $decryptCookie);
        $user_id = $user_id[1];

        $sqlQuery = "SELECT * FROM users WHERE id_user = :id";
        $stmt = $pdo->prepare($sqlQuery);
        $stmt->execute(array(":id" => $user_id));
        if ($row = $stmt->fetch()) {
            if($row["enabled_user"] === 1 && $row["active_user"] === 0) {

                        unset($row["password"], $row["salt"]);
                        $_SESSION["current_user"] = $row;
                        $isValid = true;
            } else {
                logout();
            }
        } else {
            logout();
        }
    }
    return $isValid;
}

我要求每个用户的每一页上的数据库检查存储在计算机中的cookie(我会自动激活cookie,因为对于我的应用程序,它需要让所有用户长时间登录)是否对应数据库中的ID用户。 如果是这样,我将创建一个存储用户详细信息的变量。 然后,为了保护我的页面,我使用了功能 isLoggedin()

function isLoggedin() {

    if(isCookieValid()){
        if(isset($_SESSION["current_user"])) {
            return true;

        }
    }
    return false;
}

该系统不是很重吗?因为我检查每个用户的每一页上的数据库。 预先感谢

4 个答案:

答案 0 :(得分:0)

您的系统不重,也不安全。请不要使用Cookie来验证用户,请始终使用会话。

function isLoggedin() {
        if(isset($_SESSION["current_user"])) {
            return true;
        } else {
             // here redirect to login page to verify the user id and password..
        }
}

答案 1 :(得分:0)

也许您可以做这样的事情。希望能对您有所帮助。

<?php
// Initialize the session
session_start();

// Check if the user is logged in, if not then redirect him to login page
if(!isset($_SESSION["current_user"]) || $_SESSION["current_user"] !== true){
header("location: login.php");
exit;
}
?>

答案 2 :(得分:0)

就像已经说过的那样,使用会话进行登录处理。

还有一个一般性提示:混淆职责将导致您现在遇到的问题。

例如,指标是您的函数名称isCookieValid()和此函数中的调用logout()

isCookieValid()调用应该执行它应该做的事情-检查cookie是否有效,仅此而已。

在此之后,您会更灵活地执行诸如以下条件操作

if(!isCookieValid()) {
    logout();
} 

没有像现在一样运行隐式不需要的东西。

答案 3 :(得分:0)

对于问题“该系统不是太重吗?因为我检查了每个用户的每个页面上的数据库。” 我只是说“取决于”。如果您的系统速度太慢,那就太重了。如果没有,..我不在乎。我的意思是,……如果有什么可行的,它的完成方式并不重要。

后经文。当您关心系统的繁重工作时,..您就没有在关注安全性了。您只是共享了登录系统的方式。例如,创建一个编码如下的字符串:

    $_COOKIE['rememberUser'] = base64_encode(
        'mMUa26yB943jRaJl755OM18jgR42'
    );

不要共享敏感数据... 在这个答案中,我不会谈论安全性,但是我建议您寻找jwt解决方案。 JWT(Javascript Web令牌)是事实上的标准,可以在您的用例中为您提供帮助:已经实现了许多解决方案。您在这里正在重新发明轮子。但是

我刚刚重构了您的isCookieValid方法:

function isCookieValid() {
    global $pdo;
    $isValid = false;

    if(isset($_COOKIE["rememberUser"])) {
        $decryptCookie = base64_decode($_COOKIE["rememberUser"]);
        $user_id = explode("mMUa26yB943jRaJl755OM18jgR", $decryptCookie);
        $user_id = $user_id[1];

        $sqlQuery = "SELECT * FROM users WHERE id_user = :id";
        $stmt = $pdo->prepare($sqlQuery);
        $stmt->execute(array(":id" => $user_id));

        if ($row = $stmt->fetch()) {
            if($row["enabled_user"] === 1 && $row["active_user"] === 0) {
                unset($row["password"], $row["salt"]);
                $_SESSION["current_user"] = $row;
                return true;
            }
        }
    }

    return false;
}

然后您可以使用:

function isLoggedin() {
    if (isCookieValid()) {
        logout();
    }
}