探索者的博客
2023-07-10 09:34:04 1185

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 用户登录失败后被锁定限制的功能实现

评论区

评论者头像

张三

2025-06-16

非常实用的文章,我学到了很多关于前端性能优化的知识。特别是缓存策略部分,对我帮助很大。

评论者头像

李四

2025-06-15

代码分割确实是提高前端性能的重要手段,请问作者有没有实际项目中遇到的代码分割最佳实践可以分享?

作者头像
探索者 作者
2025-06-16

感谢提问!在实际项目中,我通常会根据路由、组件和第三方库进行代码分割。对于大型组件库,可以考虑使用动态导入来实现按需加载。