温馨提示:这篇文章已超过1218天没有更新,请注意相关的内容是否还可用!
使用 PHP 简单实现当用户连续输错密码5次,锁定用户10分钟;连续被锁定3次,封禁用户 IP;如果成功登录,则输错次数和被锁定次数等相关字段清0(默认值)。
用户表部分相关字段:
denied 输错密码次数 默认:0
locked 被锁定次数 默认:0
lockTime 被锁定时间 默认:'0000-00-00 00:00:00'
ip 被锁定的IP 默认:空
主要逻辑代码:
public function comparePassword($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();
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;
}免责声明:本文来自薛才杰,不代表0oD三一o0的观点和立场,如有侵权请联系本平台处理。


发表评论