php - 尝试创建一个页面,如果是第一次登录,则检查纯文本密码,否则检查哈希密码(php)

标签 php mysql hash password-hash

这个标题很糟糕。

我正在开发一个网站,其中使用 CSV 文件导入大量用户。该 CSV 文件包括名字、姓氏、电子邮件等。在将文件上传到数据库之前,我通过一个程序运行它,该程序获取姓氏并在 CSV 中附加 7 位数字的最后 4 位,并分配将其设置为密码值。当用户第一次登录时,它会重定向到一个页面,在该页面中输入新密码,该密码会使用 password_hash 函数进行哈希处理并存储在数据库中。然后它将它们重定向到主页。

在登录页面上,它首先使用他们输入的纯文本密码检查数据库(我知道这是一种糟糕的方法,我正在尝试找到另一种方法来执行此操作...留下您的答案也适用于此!)如果没有返回结果,那么它会在数据库中查询散列传递并将其存储在变量中。然后我运行password_verify函数,即使我知道我输入了正确的密码,它也会失败。我 var_dump(ed) 哈希值 var 并回显通过password_hash 函数输入的通行证。它们不匹配,我不知道为什么。这是相关代码。

    if (!empty($_POST)){  
    $Lname = $_POST['Lname'];
    $pass = $_POST['pass'];

    //region prepare the mysqli statement and run it
    //Prepare the query
    $stmt = $con->prepare("SELECT id, Lname, password FROM users WHERE Lname = ? AND password = ?");

    //Bind parameters
    $stmt->bind_param("ss", $Lname, $pass);

    //Run the query
    $stmt->execute();

    //Get results
    $results = $stmt->get_result();

    //Make results usable
    $row = $results->fetch_object();
        //endregion

    //check to make sure results were returned and stores user id into session variable if true
    if (!empty ($row)){
        $_SESSION['user'] = $row->id;
        unset($_POST);
         header('Location: home.php');   
        }elseif (empty ($row)){

      $hasho=$con->query('SELECT password FROM users WHERE Lname = "' .$Lname. '"');
    $hash = $hasho->fetch_object();

    $passh = password_hash($pass, PASSWORD_DEFAULT);
    if ($passh == $hash) {
        $_SESSION['user'] = $row->id;
    unset($_POST);
     header('Location: home.php');  
}
else {
    echo "Invalid credentials";
}
    }
}

我确信我用这段代码做了一些非常愚蠢的事情。

谢谢!

最佳答案

您不能使用函数password_hash()来验证密码,因为盐是随机选择的。

$passh = password_hash($pass, PASSWORD_DEFAULT);
if ($passh == $hash) { // those hashes are never comparable

您应该使用password_verify()函数来检查密码:

if password_verify($pass, $hash) {

关于php - 尝试创建一个页面,如果是第一次登录,则检查纯文本密码,否则检查哈希密码(php),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31166676/

相关文章:

php - 正则表达式中的 XOR 匹配

php - 如何从其他数组向对象添加属性?

c++ - 在 C++ 中从 unsigned long long 到 unsigned int 的转换

php - 如何查找字符串句子中含有特殊字符的单词

php - 使用 echo 输出 HTML 在 PHP 中被认为是不好的做法?

mysql - 如何在mysql中的组连接子查询中使用父列?

php native 查询到codeigniter查询

mysql - 添加外键约束时出错

arrays - 解析数据并适应哈希给出了预期的结果

python - 为什么在使用用户定义的对象作为键时,Python 中的字典查找总是比较慢?