代码之家  ›  专栏  ›  技术社区  ›  Vlad Pandichi

从数据库读取MD5哈希以允许用户登录

  •  -1
  • Vlad Pandichi  · 技术社区  · 10 年前

    我使用预定义的MD5函数通过phpMyAdmin将一个用户插入数据库表。(我知道md5不安全,我应该使用bcrypt istead,但我不需要这种类型的安全性,我唯一的目的是不以明文形式存储密码)

    现在我的问题是,每当我尝试登录用户时,我永远无法读取散列密码。这是我的代码:

    正在测试用户名和密码的函数:

    function login($username, $password) {
        include('core/db/db_connection.php');
        $sql = "SELECT COUNT(user_id) FROM `_users` WHERE username = '$username' AND password = '$password'";
        $query = mysqli_query($dbCon, $sql);
        $user_id = get_user_id($username);
        $username = sanitize($username);
        $password = md5($password); // issue
        return (mysqli_result($query, 0) == 1) ? $user_id : false; // possible issue
    }
    

    日志处理代码:

    if (empty($_POST) === false) {
        $username = $_POST['username'];
        $password = $_POST['password'];
    
        if (empty($username) === true || empty($password) === true) {
            $errors[] = 'Username and/or password fields must not be left blank';
        } else if (user_exists($username) === false) {
            $errors[] = 'Username does not exist! Please register before logging in.';
        } else if (user_active($username) === false) {
            $errors[] = 'You haven\'t activated your account yet';
        } else {
            $login = login($username, $password);
            if ($login === false) {
                $errors[] = 'Username/password incorrect';
            } else {
                echo 'ok' . '<br/>';
                //set user session
                //redirect user
            }
        }
    
        print_r($errors);
    }
    

    如何读取存储的MD5密码以允许注册用户访问?

    3 回复  |  直到 10 年前
        1
  •  2
  •   Samir Selia    10 年前

    你需要使用 MD5 同时查询数据库。

    将查询更改为:

    SELECT COUNT(user_id) FROM `_users`
    WHERE username = '$username'
    AND password = MD5('$password')
    

    $password = md5($password);
    SELECT COUNT(user_id) FROM `_users`
    WHERE username = '$username'
    AND password = '$password'
    
        2
  •  1
  •   n__o    10 年前

    我不是一个php专家,但在我看来,在md5'输入密码之前,您正在从数据库中读取数据,或者,为此,对您的输入进行清理。

    你不应该这样做吗

    $username = sanitize($username);
    $password = md5($password);
    $sql = "SELECT COUNT(user_id) FROM `_users` WHERE username = '$username' AND password = '$password'";
    $query = mysqli_query($dbCon, $sql);
    

    顺便说一句,我觉得你的实现不太安全。为什么不使用框架呢?

        3
  •  1
  •   u_mulder    10 年前

    因此,您可以使用普通密码创建查询。像 password = '$password'" 假设 $password 例如,只是一个普通值 123456 . 如果您将用户密码作为哈希值存储在数据库中(我希望您这样做),那么您应该首先使用普通哈希 $密码 值并在数据库中搜索 散列的 值:

    $user_id = get_user_id($username);
    $username = sanitize($username);
    // here, we prepare our password hash
    $password = md5($password); // issue
    // next we search here:
    $sql = "SELECT COUNT(user_id) FROM `_users` WHERE username = '$username' AND password = '$password'";
    $query = mysqli_query($dbCon, $sql);
    // After that - you can check what results do you get.