[英]password_verify using password_hash error to store user in session at login
我在使用password_hash時遇到問題,當我登錄時,我想讓用戶登錄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時,此代碼可以正常工作。
您在這里所做的事情沒有用,因為您正在測試剛創建的用於與自身匹配的密碼哈希。 這將永遠是正確的。
在不知道您的會話變量的情況下,我會猜測, 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';
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.