Laravel笔记-自定义登录中新增登录5次失败锁账户功能(提高系统安全性)

Posted IT1995

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Laravel笔记-自定义登录中新增登录5次失败锁账户功能(提高系统安全性)相关的知识,希望对你有一定的参考价值。

这里用的登录就是阅读老外自定义登录和注册功能,用的是Laravel8,如果直接用这种上线,不太安全。如果被暴力破解,不断尝试就麻烦了,现在脚本小子太多了,门槛也低,普通人简单学习几天就能上手去恶心别人。这里我自己写了一个思路,不知道和php主流的是不是一样的。反正我写SpringBoot项目就是用的这种思路。

首先建一个users_lock表

其中这个users_email和users表对应,这里没有外键关系,相当于独立的,这里设计得不是很好,但感觉小站点用足够了。

对应的SQL是这样的:

CREATE TABLE `users_lock` (
  `user_email` varchar(255) NOT NULL,
  `login_num` int(11) DEFAULT 5,
  `last_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
  `lock_time` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`user_email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 注册时把这个表填充下,就好了。

关键是登录时,我的逻辑是这样的:

 public function customLogin(Request $request)
    
        $request->validate([
            'email' => 'required|email',
            'password' => 'required|min:6|max:128',
            'captcha' => 'required|captcha'
        ]);

        //验证
        date_default_timezone_set('Asia/Shanghai');
        $userLock = UserLock::find($request['email']);
        if(!$userLock)

            return redirect()->back()->withErrors('用户名或密码不正确');
        

        if($userLock['last_time'] < date('Y-m-d H:i:s',strtotime('-5 minute')) && $userLock['login_num'] <= 0)

            $userLock['login_num'] = 5;
            $userLock->save();
        

        //锁
        if($userLock['login_num'] <= 0)

            return redirect()->back()->withErrors('帐号锁定,解锁时间 ' . $userLock['lock_time']);
        

        $credentials = $request->only('email', 'password');

        if (Auth::attempt($credentials)) 

            return redirect()->intended('dashboard')
                ->withSuccess('Signed in');
        

        //次数
        $userLock['login_num'] -= 1;
        if($userLock['login_num'] <= 0)

            $userLock['lock_time'] = date('Y-m-d H:i:s',strtotime('+5 minute'));
        
        $userLock->save();

        return redirect()->back()->withErrors('用户名或密码错误');
    

逻辑:

①先检测users_lock中是否有存在此用户,如果有继续,如果没有,就直接返回;

②判断尝试次数是否为0,如果为0,并且last_time,过期(比当前时间-5分钟要小),就把尝试次数,重新设置为5。

(这里是没有办法的办法,如果有条件的朋友,建议用调度线程去弄,每5分钟跑一次,或者直接用数据库的定时器)

③当login_time为0时,说明帐号已经被锁了。

④使用Laravel的Auth去验证用户名密码。

⑤登录次数-5,如果登录次数<=0就锁账户,锁到当前时间+5分钟。

这里UserLock类是这样的:

<?php


namespace App\\Models;


use Illuminate\\Database\\Eloquent\\Model;

class UserLock extends Model

    protected $table = "users_lock";

    protected $primaryKey = 'user_email';

    protected $keyType = 'string';

    public $timestamps = false;

用起来还可以:

 

以上是关于Laravel笔记-自定义登录中新增登录5次失败锁账户功能(提高系统安全性)的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.2 Auth 登录有效,Auth::check 失败

Laravel笔记-用户登录时密码进行RSA加密(提高系统安全性)

Laravel笔记-用户登录时密码进行RSA加密(提高系统安全性)

php [Laravel - 自定义错误消息] Laravel 5.4其他登录条件 - 添加自定义错误消息。 #All #Script #Laravel #Php

Laravel 5.4 登录后重定向到自定义 url

Laravel 5.8 做个知乎 2 ——用户登录本地化和自定义消息