>백엔드 개발 >PHP 튜토리얼 >用memcache如何做用户登录失败限制?

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

WBOY
WBOY원래의
2016-06-06 20:26:361339검색

我要限制用户一小时内登陆只能密码输错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 的答案没有解决最近一小时问题,以下仅提供个思路,细节还可以完善

<code><?php // 存储失败次数时间戳
$key = "user:{$user_id}:login_failed";
$login_failed = $mem->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] </code>
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.