PHP 限制一段时间内登录尝试次数


PHP 限制一段时间内登录尝试次数

在PHP开发过程中,肯定会用到的一个功能就是登录和注册,有时候除了使用验证码来限制机器爆破之外,还有一种方式,就是限定同一账号在一段时间内的尝试次数;

比如用户名为zhangsan的用户在10分钟内只能尝试登录5次;注意此处用到了session,在函数中每次调用session_start()有些不太稳妥,同学们如果在外层开启了,此举可以不要;


对于这个小需求,我们可以采用下面的写法:

/**
 * 判断一个用户在指定时间内登录尝试次数是否超过限制
 * @param $username 用户名
 * @author YuanPengChao
 */
function check_login_try_times($username){
    // 参数检测
    if(!$username){
        return r_result('error','用户名不能为空!',[
            'sy_times' =>  0,
            'code'     => '202'
        ]);
    }
    $_max_times   = 5;    // 最大验证次数 5次
    $_max_minute  = 10;   //  分钟数 10分钟
    $time = get_now_unix_timeline(); // 获取当前时间
    session_start(); // 开启session

    // 解析数据
    $temp_arr = json_decode($_SESSION[$username],true);
    // 计算最后一次尝试时间与当前时间
    $try_time = $time - $temp_arr['time'];

    // 判断是否10分钟内 超过5次
    if((int)$temp_arr['times'] >= $_max_times && $try_time <= $_max_minute*60 ) {
        return r_result('error','已超过最大尝试次数,请10分钟后重试!',[
            'sy_times' =>  0,
            'code'     => '201'
        ]);
    }

    // 如果已经超过10分钟,则重新开始计时; 如果是首次,则时间戳一定大于设定的秒值
    if( $try_time > $_max_minute*60 ){
        $temp_arr['times']  = 1;
        $temp_arr['time']   = $time;
    }else{
        // 如果有记录 则次数加一
        $temp_arr['times'] +=  1;
    }
    // 剩余次数
    $sy_times = $_max_times - $temp_arr['times'];
    // 存入session
    $_SESSION[$username] = json_encode($temp_arr);

    return r_result('ok',$_max_minute.'分钟内还能尝试'.$sy_times.'次',[
        'sy_times' => $sy_times,
        'code'     => '200'
    ]);
}
这是一个配套的函数,用户返回数据的格式化;
/**
 * 返回结果数据
 * @param string $tp  类型:ok = 成功, wrong = 失败
 * @param string $desc 详细描述
 * @param array $data 需要返回的结果数组
 * @return array
 */
function r_result($tp, $desc = '', $data = []) {
    return [
        'result'=> $tp,
        'desc'  => $desc,
        'data'  => $data
    ];
}

那么在最外层我们要调用的时候,调用方法就是:

$ret = check_login_try_times('用户名');

我们把这个返回结果打印出来是这样的:

var_dump($ret);

未超过限制时:

image.png


超过限制时:

image.png

欢迎有问题的同学提出来,在下方评论,探讨;


上一篇 下一篇

评论



PHP笔记:补充一下: 有些同学可能会遇到用户登录成功了,但是点安全退出,再登录,重复5次后发现依然是被限制了。可能会出现这个会提,解决方法,第一就是只在判断密码错误的情况下去调用,要么就是每次登录成功之后,对$_SESSION['username']进行销毁 unset(变量);即可;也可以将其封装起来;进行调用;
12月04日 15:45
网站/shl设计:回复 PHP笔记 如果关闭浏览器了,session就没有了呀。再打开浏览器不就可以重新登陆了。
05月28日 15:26
PHP笔记:回复 网站/shl设计 用数据库
06月26日 11:37
薛之谦本人:换成cookie也可以,缺点就是容易被篡改了。
12月04日 17:15

最新评论

daliangzao_qq_com: 1112 查看原文 12月03日 10:57
PHP笔记: ypengchao@126.com 查看原文 06月26日 11:38
PHP笔记: 用数据库 查看原文 06月26日 11:37
网站/shl设计: 如果关闭浏览器了,session就没有了呀。再打开浏览器不就可以重新登陆了。 查看原文 05月28日 15:26
网站/shl设计: 站长怎么联系你有给问题请教。 查看原文 05月28日 15:25

分享

扫一扫,快速分享到微信

赞助商