关键词搜索

源码搜索 ×
×

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

发布2022-07-06浏览729次

详情内容

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

首先建一个users_lock表

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

对应的SQL是这样的:

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

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

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

  1. public function customLogin(Request $request)
  2. {
  3. $request->validate([
  4. 'email' => 'required|email',
  5. 'password' => 'required|min:6|max:128',
  6. 'captcha' => 'required|captcha'
  7. ]);
  8. //验证
  9. date_default_timezone_set('Asia/Shanghai');
  10. $userLock = UserLock::find($request['email']);
  11. if(!$userLock){
  12. return redirect()->back()->withErrors('用户名或密码不正确');
  13. }
  14. if($userLock['last_time'] < date('Y-m-d H:i:s',strtotime('-5 minute')) && $userLock['login_num'] <= 0){
  15. $userLock['login_num'] = 5;
  16. $userLock->save();
  17. }
  18. //锁
  19. if($userLock['login_num'] <= 0){
  20. return redirect()->back()->withErrors('帐号锁定,解锁时间 ' . $userLock['lock_time']);
  21. }
  22. $credentials = $request->only('email', 'password');
  23. if (Auth::attempt($credentials)) {
  24. return redirect()->intended('dashboard')
  25. ->withSuccess('Signed in');
  26. }
  27. //次数
  28. $userLock['login_num'] -= 1;
  29. if($userLock['login_num'] <= 0){
  30. $userLock['lock_time'] = date('Y-m-d H:i:s',strtotime('+5 minute'));
  31. }
  32. $userLock->save();
  33. return redirect()->back()->withErrors('用户名或密码错误');
  34. }

逻辑:

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

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

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

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

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

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

这里UserLock类是这样的:

  1. <?php
  2. namespace App\Models;
  3. use Illuminate\Database\Eloquent\Model;
  4. class UserLock extends Model
  5. {
  6. protected $table = "users_lock";
  7. protected $primaryKey = 'user_email';
  8. protected $keyType = 'string';
  9. public $timestamps = false;
  10. }

用起来还可以:

 

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载