温馨提示:这篇文章已超过907天没有更新,请注意相关的内容是否还可用!
使用 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的观点和立场,如有侵权请联系本平台处理。
发表评论