无法验证从数据库检索到的密码[已关闭]

问题描述 投票:0回答:1

我正在尝试验证 mysql 中表上的哈希密码,但它不起作用。

这是我的表格:

<form action="index.php" method="post" id="form_index">
    <div class="email">
        <label for="email">Email</label>
        <input type="email" onkeyup="onKeyup()" onblur="onBlur()" id="email" name="email" placeholder="Akun Email" />
    </div>
    <div class="password">
        <label for="password">Password</label>
        <input type="password" id="password" onkeyup="onKeyup()" onblur="onBlur()" name="password" placeholder="Kata Sandi" />
    </div>
    <div class="submit_btn">
        <button type="submit" name="submit" id="submit">Masuk</button>
    </div>
</form>

和我的 php:

if (isset($_POST["submit"])) {
    $email = $_POST["email"];
    $userPass = $_POST['password'];

    $sql = "SELECT * FROM tb_kandidat WHERE email = '$email'";
    $result = mysqli_query($conn, $sql);
    $user = mysqli_fetch_array($result, MYSQLI_ASSOC);


    if ($user) {
        if (password_verify($userPass, $user['password'])) {
            echo "success";
        }
    } else {
        echo "fail";
    }
}

这是我的桌子:

enter image description here

我的输出总是回响

fail

php mysql password-hash
1个回答
-3
投票

您面临的问题可能与您检索和比较密码的方式有关。以下是一些常见问题以及解决方法:

1。检查密码哈希:
确保在将密码插入数据库时使用

password_hash()
对密码进行哈希处理。例如:

$hashedPassword = password_hash($userPass, PASSWORD_DEFAULT);
// Insert $hashedPassword into the database

2。修剪输入:
有时额外的空格可能会导致问题。您可以在查询数据库之前修剪输入值。

$email = trim($_POST["email"]);
$userPass = trim($_POST['password']);

3.数据库连接:
使用前请确保您的数据库连接

($conn)
已正确建立。

4。检查是否有错误:
始终检查数据库查询错误。您可以在代码中添加错误处理,以查看 SQL 查询是否存在任何问题。

$result = mysqli_query($conn, $sql);
if (!$result) {
    die('Query Error: ' . mysqli_error($conn));
}

5。使用准备好的语句:

  • 您当前的代码容易受到 SQL 注入的攻击。使用准备好的 声明来防止这种情况并使您的代码更安全。

以下是如何使用准备好的语句的修改示例:

if(isset($_POST["submit"])){
    $email = trim($_POST["email"]);
    $userPass = trim($_POST['password']);
 
    $sql = "SELECT * FROM tb_kandidat WHERE email = ?";
    $stmt = mysqli_prepare($conn, $sql);
    mysqli_stmt_bind_param($stmt, "s", $email);
    mysqli_stmt_execute($stmt);
    $result = mysqli_stmt_get_result($stmt);
    $user = mysqli_fetch_array($result, MYSQLI_ASSOC);

    if($user) {
        if(password_verify($userPass, $user['password'])){
            echo "success";
        } else {
            echo "fail";
        }
    } else {
        echo "fail";
    }
}

使用准备好的语句更安全,也有助于防止 SQL 注入。确保也验证和清理您的用户输入。

© www.soinside.com 2019 - 2024. All rights reserved.