password_verify使用password_hash错误在登录

时间:2017-11-16 04:58:59

标签: php mysql login passwords

我遇到了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时,此代码可以正常工作。

1 个答案:

答案 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';
  }
}