【问题标题】:Checking if encrypted password matches the input one - PHP/MySQL检查加密密码是否与输入的密码匹配 - PHP/MySQL
【发布时间】:2015-12-23 21:35:46
【问题描述】:

所以基本上我要做的是在登录提交时验证密码匹配。但它失败了......在注册提交时,我使用 crypt() 对用户密码进行加密,并将其存储到数据库中没有问题。

我的数据库有一个表 users 有 6 行 ID / Name / Surname / Login / 密码 / 电子邮件

在登录提交时,我通过登录检查用户是否存在并且它成功,然后检查密码,这是失败的地方,我不知道问题出在哪里,因为我在另一台服务器上测试过这个脚本一次并且它工作...神奇的事情发生了...任何帮助将不胜感激,也许我可以优化一些东西,或者在从另一个文件复制/粘贴代码时我做错了什么,我看不到它

login.php

 <?php
    session_start();

    require ('./include/connect.php');

    if(isset($_POST['logBtn']))
    {
        $login = mysqli_real_escape_string($connect, $_POST['login']);
        $pass = mysqli_real_escape_string($connect, $_POST['pass']);

        $sql = "SELECT * FROM `users` WHERE `Login` = '".$login."'";
        $result = mysqli_query($connect, $sql);
        $row = $result->fetch_array();

        $db_pass = $row['Password'];
        $hashed_pass = crypt($pass, $db_pass);

        if($result->num_rows > 0)
        {   
            if($hashed_pass == $db_pass)
            {
                echo "<script>alert('You have successfully logged in!')</script>";
                echo "<script>window.open('welcome.php','_self')</script>";
                $_SESSION['user'] = $login;
            }

            else
            {
                echo "<script>alert('Wrong login or password!')</script>";
            }
        }

        else
        {
            echo "<script>alert('No users with such login found in the database!')</script>";
        }
    }

    mysqli_close($connect);
?>

<!DOCTYPE html>

<html>
<body>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Login</title>

<link rel="stylesheet" type="text/css" href="css/style.css">
<script src="./scripts/go_back.js"></script>
</head>

<div class="login">
    <form action="login.php" align="center" method="post">
        <br>
        <input type="text" name="login" placeholder="Login" required oninvalid="this.setCustomValidity('Enter login!')" oninput="setCustomValidity('')" />
        <br><br>
        <input type="password" name="pass" placeholder="Password" required oninvalid="this.setCustomValidity('Enter password!')" oninput="setCustomValidity('')" />
        <br><br>
        <button class="back_btn" onclick="goBack()">Go back</button> 

        <input class="login_btn" type="submit" name="logBtn" value="Log In">
        <br><br>
    </form>
    <a href="register.php"><button class="no_acc_btn">I do not have an account</button></a>
</div>

</body>
</html>

【问题讨论】:

  • 这需要逐步调试,而不是 Stack Overflow 上的问题。
  • 系统可能不支持您使用的算法。请尝试将echo "$hashed_pass || $db_pass"; 放在下方,看看它们之间的区别。
  • 是的,$hashed_pa​​ss != $db_pass

标签: passwords crypt


【解决方案1】:

让数据库来做:

SELECT COUNT(*) FROM USERS WHERE LGIJ = ? AND PASSWORD = f(?)

其中f() 是您最初用来存储密码的任何数据库函数。如果结果为 1,则存在这样的用户;如果结果为 0,则不存在。

但不要加密密码。有company-breaking legal reasons为什么不呢。使用哈希函数和盐。

【讨论】:

  • 好的,我找到了问题所在。密码行的长度不足以存储散列密码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-12
  • 2021-08-29
相关资源
最近更新 更多