2023-07-10 09:34:04
•
1382
PHP 用户登录失败后被锁定限制的功能实现
使用 PHP 简单实现当用户连续输错密码5次,锁定用户10分钟;连续被锁定3次,封禁用户 IP;如果成功登录,则输错次数和被锁定次数等相关字段清0(默认值)。
用户表部分相关字段:
denied 输错密码次数 默认:0
locked 被锁定次数 默认:0
lockTime 被锁定时间 默认:'0000-00-00 00:00:00'
ip 被锁定的IP 默认:空
function comparePassword($account, $password)
{
## $account输入的用户名 $password 输入的密码
if(!$account or !$password) return false;
/* 先通过用户名从数据库中获取该用户记录 */
$user = $this->dao->select('*')->from('user')
->Where('account')->eq($account)
->fetch();
if(!$user) return false;
// 连续输错密码5次,锁定用户10分钟;连续被锁定3次,封禁用户IP;成功登录,输错次数和被锁定次数清0;
if($user->ip != ''){
$surrentIP = helper::getRemoteIp();##获取用户的ip
if ($surrentIP == $user->ip) {
$this->lang->user->loginFailed = $this->lang->user->banned;
return false;
}else{
$user->ip = '';
}
}
if($user->lockTime != '0000-00-00 00:00:00'){
$timeDiff = time() - strtotime($user->lockTime);
if($timeDiff >0 && $timeDiff <= 10*60){
$this->lang->user->loginFailed = sprintf($this->lang->user->locked, '10');
$this->dao->update('user')->data($user)->where('id')->eq($user->id)->exec();
return false;
}else{
$user->denied = 0;
$user->lockTime = '0000-00-00 00:00:00';
}
}
// 对比用户输入的密码与数据库存储的密码并更新记录
$password = md5($password . $user->account);
if(!($password == $user->password)){
$user->denied ++;
if($user->denied > 4){
$user->lockTime = date('Y-m-d H:i:s', time());
$user->locked ++;
if($user->locked > 2){
$user->ip = helper::getRemoteIp();
}
}
$this->dao->update('user')->data($user)->where('id')->eq($user->id)->exec();
return false;
}
$user->ip = '';
$user->denied = 0;
$user->locked = 0;
$user->lockTime = '0000-00-00 00:00:00';
$this->dao->update('user')->data($user)->where('account')->eq($user->account)->exec();
return $user;
}
PHP 用户登录失败后被锁定限制的功能实现