热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

用memcache如何做用户登录失败限制?

我要限制用户一小时内登陆只能密码输错12次,如果在最近一小时内累计密码错误超过12次就直接不能登录,如何用memcache实现,不用mysql,因为碰到mysql的loginlog表越来越大,之前mysql的实现方式太慢了
我要限制用户一小时内登陆只能密码输错12次,如果在最近一小时内累计密码错误超过12次就直接不能登录,如何用memcache实现,不用mysql,因为碰到mysql的login log表越来越大,之前mysql的实现方式太慢了

回复内容:

我要限制用户一小时内登陆只能密码输错12次,如果在最近一小时内累计密码错误超过12次就直接不能登录,如何用memcache实现,不用mysql,因为碰到mysql的login log表越来越大,之前mysql的实现方式太慢了

如果你不需要记录用户登陆的历史详情,只是想要限制登陆次数就非常简单

  1. 为每个用户创建一个特别的key(举个例子,user_login_count_${用户ID}

  2. 每次登陆的时候拿到用户名,就去memcache去取这个key的value,如果发现其值已经超过12,则在此时报错说明只能尝试12次

  3. 如果不存在这个key,那么通过set新建,并把值记为1,expire时间设置为3600秒

  4. 如果登录失败,那么对这个key对应的value进行increment的操作,并重新设置超时时间为3600秒

  5. 如果登陆成功,则直接清除这个key的内容

因为 @vimac 的答案没有解决最近一小时问题,以下仅提供个思路,细节还可以完善

get($key) or array();
$allow_times = 12;
if(! checkAllowTimes($login_failed, $allow_times)){
    throw new Exception("allow times max", 1);
}

if(! passValid($user_id, $password)){
    array_unshift($login_failed, time());
    // 最多存 12 条记录
    if(count($login_failed) > $allow_times){
        $login_failed =  array_slice($login_failed, 0, $allow_times);            
    }
    
    $mem->set($key, $login_failed, 3600);
}else{
    // 登录成功删除失败记录,取决于是连续失败还是累计失败?
    $mem->delete($key);

    // ...
}

function passValid($user_id, $password){
    // ...
    // 伪代码
    return true or false;
}

function checkAllowTimes($login_failed, $allow_times){
    $last_hour = strtotime('1 hours ago');
    for($i = 0; $i = $allow_times - 1){
            return false;
        }

        // 1 小时前的登录记录不检索
        if($login_failed[$i] <= $last_hour){
            return true;
        }
    }
    return true;
}

推荐阅读
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • MACElasticsearch安装步骤及验证方法
    本文介绍了MACElasticsearch的安装步骤,包括下载ZIP文件、解压到安装目录、启动服务,并提供了验证启动是否成功的方法。同时,还介绍了安装elasticsearch-head插件的方法,以便于进行查询操作。 ... [详细]
  • 解决VS写C#项目导入MySQL数据源报错“You have a usable connection already”问题的正确方法
    本文介绍了在VS写C#项目导入MySQL数据源时出现报错“You have a usable connection already”的问题,并给出了正确的解决方法。详细描述了问题的出现情况和报错信息,并提供了解决该问题的步骤和注意事项。 ... [详细]
  • 本文介绍了关于apache、phpmyadmin、mysql、php、emacs、path等知识点,以及如何搭建php环境。文章提供了详细的安装步骤和所需软件列表,希望能帮助读者解决与LAMP相关的技术问题。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • 众筹商城与传统商城的区别及php众筹网站的程序源码
    本文介绍了众筹商城与传统商城的区别,包括所售产品和玩法不同以及运营方式不同。同时还提到了php众筹网站的程序源码和方维众筹的安装和环境问题。 ... [详细]
  • 如何在php中将mysql查询结果赋值给变量
    本文介绍了在php中将mysql查询结果赋值给变量的方法,包括从mysql表中查询count(学号)并赋值给一个变量,以及如何将sql中查询单条结果赋值给php页面的一个变量。同时还讨论了php调用mysql查询结果到变量的方法,并提供了示例代码。 ... [详细]
  • 本文介绍了在MacOS系统上安装MySQL的步骤,并详细说明了如何设置MySQL服务的开机启动和如何修改MySQL的密码。通过下载MySQL的macos版本并按照提示一步一步安装,在系统偏好设置中可以找到MySQL的图标进行设置。同时,还介绍了通过终端命令来修改MySQL的密码的具体操作步骤。 ... [详细]
  • Python项目实战10.2:MySQL读写分离性能优化
    本文介绍了在Python项目实战中进行MySQL读写分离的性能优化,包括主从同步的配置和Django实现,以及在两台centos 7系统上安装和配置MySQL的步骤。同时还介绍了创建从数据库的用户和权限的方法。摘要长度为176字。 ... [详细]
author-avatar
1994-MMMs
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有