PHP | 2FA登录系统

PHP | 2FA登录系统,php,security,redirect,Php,Security,Redirect,我目前正在开发一个web应用程序的登录页面。为了提高安全性,用户可以在收到邮件中的8位代码后激活2FA。用户通过login.php登录。如果用户启用了2FA(这是通过If($row['2FA']='1')语句检查的),它应该生成一个通过电子邮件发送的8位代码。代码还与用户id(uid)和有效截止日期(代码有效期为15分钟)一起存储在数据库中的单独表格中 我现在遇到的问题是,当用户启用2FA时,它确实会生成8位代码并在邮件中发送,但它不会将用户重定向到verify login.php页面,用户必须

我目前正在开发一个web应用程序的登录页面。为了提高安全性,用户可以在收到邮件中的8位代码后激活2FA。用户通过
login.php
登录。如果用户启用了2FA(这是通过
If($row['2FA']='1')
语句检查的),它应该生成一个通过电子邮件发送的8位代码。代码还与用户id(
uid
)和有效截止日期(代码有效期为15分钟)一起存储在数据库中的单独表格中

我现在遇到的问题是,当用户启用2FA时,它确实会生成8位代码并在邮件中发送,但它不会将用户重定向到
verify login.php
页面,用户必须在该页面中输入8位代码。我是PHP新手,也检查过类似的问题,但似乎没有一个适合我

如果你发现了这个问题,请告诉我

if(isset($_POST['loginbtn'])){
    if($_POST['vendor'] == ''){
    }else if($_POST['vendor'] != 'DEPARTMENT'){
        
    }else{
        $email = mysqli_real_escape_string($con, $_POST['login_user_email']);
        $password = mysqli_real_escape_string($con, md5($_POST['login_user_passwd']));

        $sql = mysqli_query($con,"SELECT * FROM `table` WHERE `email`='$email' AND `password`='$password' AND `Approvel`='Activate'");
        $row = mysqli_fetch_array($sql);

        if(mysqli_num_rows($sql) > 0){
            if($row['2FA'] == '1'){ // Checks whether the user has 2FA enabled
                $token = mt_rand(10000000,99999999); // Sets the 8-digit 2FA token
                
                $message = 'HTML EMAIL BODY';
                $subject = "Here's your login verification code";
                $url = 'https://api.elasticemail.com/v2/email/send';
                $apikey = 'APIKEY';
                try {
                    $post = array('from' => 'SENDER',
                        'fromName' => 'SENDER NAME',
                        'apikey' => $apikey,
                        'subject' => $subject,
                        'to' => $email,
                        'bodyHtml' => $message,
                        'isTransactional' => true);
                
                    $ch = curl_init();
                    curl_setopt_array($ch, array(
                        CURLOPT_URL => $url,
                        CURLOPT_POST => true,
                        CURLOPT_POSTFIELDS => $post,
                        CURLOPT_RETURNTRANSFER => true,
                        CURLOPT_HEADER => false,
                        CURLOPT_SSL_VERIFYPEER => false
                    ));
                
                    $result = curl_exec($ch);
                    curl_close($ch);
                
                    if ($result['success'] == true) {
                        $validThrough = date('d-m-Y H:i', time()+900); // Sets current time +15 minutes
                        $uid = $row['id'];
                        $encrypted_uid = encrypt($uid);
                        $encrypted_token = encrypt($token);
                        $sqlInsert = mysqli_query($con,"INSERT INTO `2FA`(`uid`, `2FA`, `validThrough`) VALUES ('$uid','$token','$validThrough')");
                        header("Location: https://website.com/verify-login?id=".$encrypted_uid."&token=".$encrypted_token);
                    }
                    
                    } catch (Exception $ex) {
                        //Could not send 2FA email
                        
                    }

根据您在评论中提到的
var\u dump
result,您应该使用
if($result['success]!==false)
而不是
if($result['success]==true)

因为说
curl\u exec
失败时返回false


所以,如果您在if语句中勾选“notfalse”,它将到达您的
头()
函数。这可能是一个安全风险!切勿以明文或使用MD5/SHA1存储密码!仅存储使用PHP创建的密码哈希,然后可以使用进行验证。看看这篇文章:了解更多关于在URL中放置未编码的值可能导致意外错误的信息。请使用
http\u build\u query()
构建URL的查询字符串部分。是否遇到任何排序错误?在尝试实现2FA之前,我会先解决所有较小的问题。如果当前的安全措施被破坏,增加更多的安全措施有什么意义