我遇到了password_hash的问题,当我登录时我想让用户登录会话,但是当我使用密码验证时不工作,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时,此代码可以正常工作。
答案 0 :(得分:1)
您在那里做的事情毫无用处,因为您正在测试刚创建的用于与自身匹配的密码哈希。这总是如此。
在不知道你的会话变量的情况下,我猜你if ($_SESSION['empresaID'] == "")
会导致你的错误,除非你把它设置在其他地方。
但要改进你的代码:
您应该将哈希存储在数据库中并测试结果以与输入的密码匹配。 此过程的目标是您不必将密码以明文形式存储在数据库中。
另外,请使用预准备语句来防止SQL注入。在我的示例中,我使用了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';
}
}