PHP | 2FA登录系统
我目前正在开发一个web应用程序的登录页面。为了提高安全性,用户可以在收到邮件中的8位代码后激活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页面,用户必须
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之前,我会先解决所有较小的问题。如果当前的安全措施被破坏,增加更多的安全措施有什么意义