PHP用户密码输错N次,自动锁定

功能逻辑

1)给用户表增加两个字段:err_time(登录账号密码输错的时间),err_count(账号密码输错次数)。在这里波波说的一点就是也有朋友建议用缓存的方式,但是我想了一下如果用缓存的话,存在一些人会登录一下清除一下浏览器缓存,这样即使多次输错,也实现不了账号冻结,无法保证安全。想尝试的朋友可以尝试,当然也可以将数据写进内存中。

2)若err_time不为空,则检查记录时间和现在当前时间的差值。如果时间差值大于24则清除用户表中err_time和err_count的字段值,并进行账户密码校验。

若小于24小时,则检查err_count的值是否大于等于3,大于等于3的时候提示账户冻结,禁止登陆,小于3的时候看账户密码的校验返回值,确定登陆成功还是失败。

3)若err_time为空,则执行账户密码的校验。

直接上代码。原生的tp,laravel改造下直接就可以用了

<?php
    require("conn.php");
    require("function.php");
    session_start();
    //用户登录验证,登录次数>=3,账户冻结;24小时自动解冻
    $uid=guolv(trim($_POST['uid']));
    $pass=guolv(trim($_POST['pass']));
 
    //uid和pass根据自己情况获取
    //检查用户是否存在
    $row=$mysql->query("select * from admindata where `uid`={$uid} limit 1");
 
    $time=date("y-m-d h:i:s");
 
    if(empty($row['err_time'])){
        //err_time为空,直接进行密码校验
        $login=$mysql->query("select * from admindata where `uid`={$uid} and `pass`={$pass} limit 1");
        if($login){
            echo "登录成功,设置跳转";//登录成功执行的动作
        }else{
            $count=$login['err_count'];
            $mysql->query("UPDATE admindata SET `err_time`={$time},`err_count`={$count}+1 where `uid`={$uid}");
        //账号密码不对其他操作可以写在下方
        }
    }else{
        //如果err_time不为空
        $err_time=$login['err_time'];
        $hour=$hour=floor((strtotime($time)-strtotime($err_time))%86400/3600);//计算时间差
        $count=$login['err_count'];
        if($hour<24&&$count>3){
            //24小时以内,错误次数大于3 账户冻结
            echo "您的账户已经被冻结,请联系网站管理员";//可以改为其他提醒方式
            exit;
        }else{
            //大于24小时,自动解除冻结,重置err_time和err_count的值
            $mysql->query("UPDATE admindata SET `err_time`='null',`err_count`='0' where `uid`={$uid}");
            $login=$mysql->query("select * from admindata where `uid`={$uid} and `pass`={$pass} limit 1");
            if($login){
                echo "登录成功,设置跳转";//登录成功执行的动作
            }else{
                //解除冻结后,账号密码错误的情况,更新数据库,返回登录页
                $count=$login['err_count'];
                $mysql->query("UPDATE admindata SET `err_time`={$time},`err_count`={$count}+1 where `uid`={$uid}");
                echo "<script type=\"text/javascript\">document.location(\"login.php\",301);</script>";
            }
        }
    }
?>

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PHP柚子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值