Heim > Backend-Entwicklung > PHP-Tutorial > 用memcache如何做用户登录失败限制?

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

WBOY
Freigeben: 2016-06-06 20:26:36
Original
1343 Leute haben es durchsucht

我要限制用户一小时内登陆只能密码输错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>
Nach dem Login kopieren
Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage