当前位置: 首页 > 知识库问答 >
问题:

password_verify使用password_hash错误在登录时将用户存储在会话中

萧树
2023-03-14

我的密码\u散列有问题,当我登录时,我想让用户登录会话,但当我使用密码验证时不工作,回显不返回任何内容。我怎样才能解决这个问题?谢谢这是我的代码:

    <?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个答案

汪才
2023-03-14

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

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

但要改进您的代码:

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

另外,请使用准备好的语句来防止SQL注入。在我的示例中,我使用了PDO。

使用预先准备好的语句,您可以避免使用mysqli\u real\u escape\u 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文件中,有这些 在我的PHP注册文件中,有这个。 现在,从本质上讲,我这样做是为了使它散列密码,并在注册时将其自身插入数据库中。这样做。 但是,它无法验证它。两种结果都给出2个不同的哈希值,我不知道自己可能做错了什么。我还尝试只是使其再次哈希输入,然后检查数据库中的password_hash,但这没有用。 使用这些的正确方法是什么? (同样,$ passSign和$ u

  • 问题内容: 目前,当用户登录时,我创建了2个会话。 因此,那些需要登录的页面,我只是这样做: 有安全漏洞吗?我的意思是,很容易破解我的会话吗?人们如何修改会话?以及如何预防呢? 编辑: 刚刚找到链接,这些方法够好吗?请发表您的意见。我仍然没有得到最好的答案。 问题答案: 术语 用户: 访客。 客户端: 安装在特定计算机上的特定于Web的软件。 了解会议 为了了解如何使会话安全,您必须首先了解会话的

  • 问题内容: 我的注册脚本接受用户的密码,然后使用PHP的password_hash函数对密码进行加密,然后将其放入数据库中。当我使用刚刚创建的用户登录时,出现了检查密码是否相同的错误。就我而言,不是。在登录脚本中调用password_verify函数时,我在做什么错? 寄存器 登录 这是我执行var_dump时得到的: 很明显,密码没有匹配在一起。因此,在注册脚本上,密码被散列并发送到数据库。然后

  • 我已经使用jsp创建了一个登录环境<代码>索引。jsp,登录。jsp。我从数据库中获取用户名和密码。如果用户名和密码与数据库匹配,则登录过程将完美完成。当用户给出错误的名称或密码时,它会显示错误消息,并重定向到登录页面。没什么问题,但我第一次登录时遇到了一个问题。提交错误名称或密码后显示错误消息的位置,该位置显示为空。 为什么显示null? 下面是我的代码 指数jsp login.jsp

  • 美好的一天 这个问题已经在创建MCVE时得到解决(感谢Kukeltje让我这样做:)) 请参阅下面发布的答案,了解有效的MCVE。 例如,在一个名为@ViewScoped@的bean中,我想这样做: 然后,在另一个@ViewScoped@命名bean上,我希望检索存储的值(由于@PostConstruct获取空值,尝试抑制应用程序部署上的错误) 应用内的工作流确保设置值的页面在需要这些值的页面之前

  • 当用户登录时,我将用户id存储到会话中,然后我希望将该用户id传递给ajax以检索数据库中的其他信息。存储在会话中的用户ID未传递给allResult。php我的登录页面代码片段,我在其中进行会话: 现在,登录后,用户将被带到仪表板: 在仪表板中,我试图使用ajax访问用户的其他数据 我需要获取用户id才能运行allResult。php所有结果。php