php - 无法应用两个不同的条件并检查密码哈希
问题描述
快速检查一下我想弄清楚的那个。首先,如果我的代码伤害了你的眼睛,我想道歉,我两周前刚开始使用 php,我正在尽力应用逻辑:-D
所以 2 因素只是通过用户配置文件实现的,这意味着如果该功能仍未启用,用户仍然可以成功登录,启用 2 因素后,他将被重定向以验证代码。话虽如此,login.php 帖子将需要检查以下内容:
- 如果 2fac 未启用,则检查凭据/密码哈希然后登录。
- 如果启用了 2fac,则检查密码是否仍然正确,然后重定向到 2factcode.php 进行代码验证。
- 如果 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');
'''
- 所以这是我一直在尝试调整的内容(不确定是否有意义),如果该语句无效意味着没有找到行,因为 is2facenabled 值为“1”,那么我仍然检查密码哈希是否正确然后转到验证 2fac 代码。*
如果我删除下面的密码检查,那么它可以工作,但它永远不会检查密码是否正确,如果我保持原样,那么如果我输入错误的密码,页面会刷新且没有错误并返回输入凭据。我认为 $_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
解决方案
这基本上相当于我认为的第一条编程规则:分解问题。
与其尝试编写一段代码来检查用户存在、密码和 2fac 状态,不如一次做一个:
- 根据提供的电子邮件地址从数据库中选择详细信息。如果没有找到行,则它们没有注册,因此您无需执行任何其他操作。
- 您可以在 SQL 中包含“已确认地址”检查,或者您可以在检查其他任何内容之前将其编写为单独的 if 语句。
- 接下来,检查提供的密码是否正确。如果不是,则用户是否启用 2fac 无关紧要,因为您不会让他们登录。
- 最后,检查用户是否启用了 2fac。如果他们这样做,请重定向到 2fac 步骤;如果没有,将其标记为已成功登录。
推荐阅读
- javascript - 当我尝试在 Visual Studio Code 的终端中使用 Node.js 时,我收到“文档未定义”错误消息
- java - 如何访问子类的变量?
- javascript - React Hook useEffect 缺少依赖项:'init'
- javascript - 在 Node.js 服务器中,通过 axios.create() 创建多个 Axios 客户端与使用单例样式的适配器相比,是否存在性能损失?
- sql - 使用 sql pivot 获取临时表中的所有值
- python - 如何检查数组中是否找不到特定字符串然后在python中打印出“找不到字符串”?
- docker - Dockerize 两件事并在一个目录中使用
- windows - Raku:带空格的 shell 调用的语法是什么?
- arrays - 如何将单个 Fortran 文件拆分为单独的子例程和函数文件
- sql - BigCommerce / SkyVia Sql 数据集成