原生php 实现redis登录五次被禁,隔天再登陆

php 复制代码
<?php
/**
 * Created by PhpStorm.
 * User: finejade
 * Date: 2023-10-18
 * Time: 11:08
 */
session_start();

include_once('header.php');
include_once('connect.php');
include_once('common.php');
include_once('redis.php');
try {
    // 常量 用户错误次数记录
    define("USER_LOGIN_ERROR_NUM", 'user_login_error_num');
    //错误上线,超过明天登录
    define("ERROR_COUNT", 5);
    $username = isset($_POST['username']) ? $_POST['username'] : '';
    $password = isset($_POST['username']) ? $_POST['password'] : '';
    $captcha = isset($_POST['captcha']) ? $_POST['captcha'] : '';
    if ($_SERVER['REQUEST_METHOD'] == 'POST') {
        $ulen = strlen($username);
        $plen = strlen($password);
        if ($_SESSION ["captcha"] != $captcha) {
            return error('图形验证码不正确');
        }

        if (!preg_match("/^[\w]+$/", $username) || $ulen < 6 || $ulen > 15) {
            return error('用户名只能是字母或数字,且长度为6到15个字符');
        }
        if (!preg_match("/^[\w]+$/", $password) || $plen < 6 || $plen > 15) {
            return error('密码只能是字母或数字,且长度为6到15个字符');
        }

        $sql = sprintf("SELECT id,username,password,salt FROM m_user where `username`='%s' limit 1", $username);
        $result = $conn->query($sql);
        $arr = [];

        if ($result->num_rows <= 0) {
            return error('用户名不存在,请核实后重新登陆');

        }
        $user = $result->fetch_assoc();
        if ($redis->exists(USER_LOGIN_ERROR_NUM . '_' . $user['id'])) {
            if ($redis->get(USER_LOGIN_ERROR_NUM . '_' . $user['id']) >= ERROR_COUNT) {
                return error('您登陆的错误次数已超过' . ERROR_COUNT . '次,请明天再试');
            }
        };

        $pwd = $user['password'];
        $sub_time = strtotime(date('Y-m-d', strtotime('+1 day'))) - time();
        if ($pwd != encryption($password, $user['salt'])) {
            //如果密码不对,则加入redis 密码错误限制,到达5次,则次日才能登录
            if ($redis->exists(USER_LOGIN_ERROR_NUM . '_' . $user['id'])) {
                $redis->incr(USER_LOGIN_ERROR_NUM . '_' . $user['id']);
            } else {
                $redis->set(USER_LOGIN_ERROR_NUM . '_' . $user['id'], 1, $sub_time);
            }
            return error('用户名或密码错误');
        }
        $user_info = [];
        $user_info['id'] = $user['id'];
        $user_info['username'] = $user['username'];
        $user_info['nickname'] = $user['nickname'];

        $_SESSION['user_id'] = $user['id'];
        $_SESSION['username'] = $user['username'];
        $_SESSION['nickname'] = $user['nickname'];
        //如果登录成功,删除该用户错误次数限制
        $redis->del(USER_LOGIN_ERROR_NUM . '_' . $user['id']);
        $conn->close();
        return success($user_info, '登录成功');
    }


} catch (Exception $exception) {
    echo error($exception->getMessage());
}

?>

redis配置文件

php 复制代码
$redis = new Redis();
$redis->connect('127.0.0.1', 6379); // 连接到Redis
$redis->auth('123456789');
$redis->select(0);
相关推荐
川贝枇杷膏cbppg4 小时前
Redis 的 RDB 持久化
前端·redis·bootstrap
源代码•宸5 小时前
goframe框架签到系统项目(BITFIELD 命令详解、Redis Key 设计、goframe 框架教程、安装MySQL)
开发语言·数据库·经验分享·redis·后端·mysql·golang
川贝枇杷膏cbppg5 小时前
Redis 的 AOF
java·数据库·redis
今晚务必早点睡7 小时前
Redis——快速入门第二课:Redis 常用命令 + 能解决实际问题
数据库·redis·bootstrap
horizon727411 小时前
【Redis】Redis 分片集群搭建与故障转移实战指南
java·redis
渣渣盟11 小时前
网络命令大全:轻松解决网络故障
开发语言·php
百***074512 小时前
gpt-image-1.5国内API稳定接入全方案(含多模态实操)
开发语言·gpt·php
小韩博12 小时前
小迪第42课:PHP应用&MYSQL架构&SQL注入&跨库查询&文件读写&权限操作
sql·mysql·网络安全·架构·php
天聚数行13 小时前
华为鸿蒙系统(HarmonyOS)调用天聚数行 API 教程
华为·php·harmonyos·tianapi·天聚数行
TG:@yunlaoda360 云老大14 小时前
如何在华为云国际站代理商控制台进行基础状态核查的常见问题解答
数据库·华为云·php