首页 > 解决方案 > 无法应用两个不同的条件并检查密码哈希

问题描述

快速检查一下我想弄清楚的那个。首先,如果我的代码伤害了你的眼睛,我想道歉,我两周前刚开始使用 php,我正在尽力应用逻辑:-D

所以 2 因素只是通过用户配置文件实现的,这意味着如果该功能仍未启用,用户仍然可以成功登录,启用 2 因素后,他将被重定向以验证代码。话虽如此,login.php 帖子将需要检查以下内容:

  1. 如果 2fac 未启用,则检查凭据/密码哈希然后登录。
  2. 如果启用了 2fac,则检查密码是否仍然正确,然后重定向到 2factcode.php 进行代码验证。
  3. 如果 1 或 2 中的密码不正确,则会出错。

'''

$email=mysqli_real_escape_string($db,$_POST['email']);{


$password=mysqli_real_escape_string($db,$_POST['password']);


$stmt = $db->prepare("SELECT password FROM users WHERE email  = ? AND isEmailConfirmed='1' AND is2facEnabled='0'");
$stmt->bind_param("s", $_POST['email']);

$stmt->execute();
$stmt->bind_result($hash);

//checking hash
if ($stmt->fetch() && password_verify($_POST['password'], $hash)) {


$_SESSION['email'] = $email;


header('location: prod.php');

'''

如果我删除下面的密码检查,那么它可以工作,但它永远不会检查密码是否正确,如果我保持原样,那么如果我输入错误的密码,页面会刷新且没有错误并返回输入凭据。我认为 $_POST 有问题,但不确定。

elseif (!$stmt->fetch() && password_verify($_POST['password'], $hash)) {

    header('location: login2factorverification.php');   


}else {
array_push($errors, "Incorrect credentials or email needs verification");


enter code here

我的问题是,我该如何完成这些检查并正确登录,提前谢谢你。

问候,MF

标签: phpbcryptverification

解决方案


这基本上相当于我认为的第一条编程规则:分解问题。

与其尝试编写一段代码来检查用户存在、密码和 2fac 状态,不如一次做一个:

  • 根据提供的电子邮件地址从数据库中选择详细信息。如果没有找到行,则它们没有注册,因此您无需执行任何其他操作。
  • 您可以在 SQL 中包含“已确认地址”检查,或者您可以在检查其他任何内容之前将其编写为单独的 if 语句。
  • 接下来,检查提供的密码是否正确。如果不是,则用户是否启用 2fac 无关紧要,因为您不会让他们登录。
  • 最后,检查用户是否启用了 2fac。如果他们这样做,请重定向到 2fac 步骤;如果没有,将其标记为已成功登录。

推荐阅读