Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从数据库读取MD5哈希以允许用户登录_Php_Md5 - Fatal编程技术网

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

Php 从数据库读取MD5哈希以允许用户登录,php,md5,Php,Md5,我已经使用预定义的MD5函数通过phpMyAdmin将一个用户插入到我的数据库表中。我知道md5是不安全的,我应该使用bcrypt-istead,但我不需要那种类型的安全性,我唯一的目的不是以明文形式存储密码 现在我的问题是,每当我尝试登录用户时,我都无法读回散列密码。这是我的代码: 正在测试用户名和密码的函数: function login($username, $password) { include('core/db/db_connection.php'); $sql =

我已经使用预定义的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密码以允许注册用户访问?

查询数据库时需要使用MD5

将查询更改为:

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


因此,您可以使用普通密码创建一个查询。As password=“$password”假设$password只是一个普通值,例如123456。 若您将用户密码作为散列值存储在数据库中,我希望您这样做,则应首先散列纯$password值,然后在数据库中搜索散列值:


我不是php专家,但在我看来,您在md5'ing密码之前,或者在清理输入之前,正在读取数据库中的数据

你不应该这样做吗

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

顺便说一句,您的实现对我来说似乎不太安全。为什么不使用框架?

这可能会迫使数据库扫描每一行,然后散列密码并进行比较。最好将散列密码存储在数据库中,并将查询更改为使用散列密码。@myte按查询顺序筛选许多数据库的筛选器,因此首先它将筛选所有username=$username,然后才是MD5,因此此解决方案可能很好,meI的upvote正在处理一个项目,我应该从头开始构建它。我现在不是在寻找安全性,我唯一的目的不是在数据库中以明文形式存储密码。我还没有进入注册部分,所以我已经手动将一个用户插入数据库,并使用password字段旁边的MD5选项对密码进行散列。我的问题是,我无法读取此哈希密码,因此无法登录我拥有的唯一用户,这不会改变我答案的核心。所有答案都指出,您正在尝试从数据库读取明文密码,因此您的查询将永远不会返回您要查找的用户id是的,您是正确的。在本例中,我不需要更改代码中的任何内容,只需要按照您建议的顺序进行更改。这就解决了我的问题。你的答案是正确的,我需要改变我编写代码的顺序。只有在查询前对密码进行哈希运算后,才会返回预期结果。投票赞成这件事为什么被否决了?我已经搜索过了,但找不到重复的。虽然有许多与MD5相关的问题,但在提出这些问题时,没有一个建议的问题有适合我需要的解决方案。
$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.    
$username = sanitize($username);
$password = md5($password);
$sql = "SELECT COUNT(user_id) FROM `_users` WHERE username = '$username' AND password = '$password'";
$query = mysqli_query($dbCon, $sql);