簡體   English   中英

password_verify使用password_hash錯誤在登錄時將用戶存儲在會話中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM