gpt4 book ai didi

php - 使用password_hash错误进行password_verify在登录时将用户存储在 session 中

转载 作者:行者123 更新时间:2023-11-29 10:31:35 24 4
gpt4 key购买 nike

我遇到了密码哈希问题,当我登录时,我想让用户登录 session ,但当我使用密码验证时不起作用,ECHO 不返回任何内容。我该如何解决这个问题?谢谢这是我的代码:

    <?php
session_start();
include_once("../Backend/conexao_db.php");

if((isset($_POST['txt_usuario'])) && (isset($_POST['txt_senha']))) {
$usuario = mysqli_real_escape_string($conn, $_POST['txt_usuario']);
$pass = mysqli_real_escape_string($conn, $_POST['txt_senha']);
$passwordhash = password_hash($pass, PASSWORD_DEFAULT);

$result_usuario = "SELECT * FROM tbl_Usuario WHERE email = '$usuario' && senha = '$pass'";
$resultado_usuario = mysqli_query($conn, $result_usuario);
if ($resultado = mysqli_fetch_assoc($resultado_usuario)) {
if (password_verify($pass, $passwordhash)) {


$_SESSION['usuarioId'] = $resultado['id'];
if ($_SESSION['empresaID'] == "") {
echo $_SESSION['usuarioId'];

} else {

}

}
}
}

当我不使用password_verify时,此代码可以完美运行。

最佳答案

您在那里所做的事情是无用的,因为您正在测试刚刚创建的密码哈希以与其自身匹配。这永远都是事实。

如果不知道您的 session 变量,我会猜测 if ($_SESSION['empresaID'] == "") 会导致您的错误,除非您在其他地方设置它。

但是要改进你的代码:

您应该将哈希存储在数据库中并测试结果与输入的密码是否匹配。此过程的目标是您不必将密码以明文形式存储在数据库中。

此外,请使用准备好的语句来防止 SQL 注入(inject)。在我的示例中,我使用 PDO .

使用准备好的语句,您可以避免 mysqli_real_escape_string - 如果其中有任何特殊字符,它会更改密码。

if((!empty($_POST['txt_usuario'])) && (!empty($_POST['txt_senha']))) {
$usuario = $_POST['txt_usuario'];
$pass = $_POST['txt_senha'];

// returns a connection to pdo
$conn = Database::connectPDO();
$stmt = $conn->prepare('SELECT * FROM tbl_Usuario WHERE email = :email');
$stmt->bindParam(':email', $usuario);

if($stmt->execute()) {
while($user = $stmt->fetch(PDO::FETCH_ASSOC)) {
if(password_verify($pass, $user['senha'])) {
echo 'success';
}
}
}
}

因此,如果您要添加用户,则应将散列后的密码存储在数据库中,以便此功能发挥作用:

if((!empty($_POST['txt_usuario'])) && (!empty($_POST['txt_senha']))) {
$usuario = $_POST['txt_usuario'];
$pass = $_POST['txt_senha'];

$hashedPassword = password_hash($pass, PASSWORD_DEFAULT);

$conn = Database::connectPDO();
$stmt = $conn->prepare('INSERT INTO tbl_Usuario (email, senha) VALUES (:email, : senha)');
$stmt->bindParam(':email', $usuario);
$stmt->bindParam(':senha', $hashedPassword);

if($stmt->execute()) {
echo 'successfully registered';
}
}

关于php - 使用password_hash错误进行password_verify在登录时将用户存储在 session 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47321932/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com