如何保护Laravel用户授权API免受暴力破解攻击?
Laravel API登录错误次数限制方案(防暴力破解)
针对桌面应用对接Laravel API的登录场景,要限制错误密码请求次数防范暴力破解,以下是几种实用落地的方案:
一、用Laravel自带Throttle中间件(快速上手)
Laravel内置的throttle中间件可直接限制请求频率,默认按IP维度管控。
路由层面配置
在登录路由上直接挂载中间件,比如限制1分钟内最多5次请求:
Route::post('/login', [AuthController::class, 'login'])->middleware('throttle:5,1');
参数5,1代表1分钟内允许5次请求,超过后API会返回429状态码。
局限性
默认Throttle按IP限制,若同一IP下有多个合法用户,可能误限制正常登录。如果需要针对用户账号精准限制,就得自定义逻辑。
二、自定义账号级错误次数限制(更贴合场景)
针对具体用户的登录失败次数做限制,可借助Laravel缓存系统存储计数:
登录逻辑示例
在AuthController的login方法中加入以下逻辑:
public function login(Request $request) { $request->validate([ 'email' => 'required|email', 'password' => 'required', ]); $user = User::where('email', $request->email)->first(); if (!$user) { return response()->json(['message' => '账号不存在'], 401); } $cacheKey = "login_failed_{$user->id}"; $maxAttempts = 5; $lockoutMinutes = 15; // 检查是否已达错误次数上限 if (Cache::has($cacheKey) && Cache::get($cacheKey) >= $maxAttempts) { return response()->json([ 'message' => '错误次数过多,请15分钟后再试' ], 429); } // 验证密码 if (!Hash::check($request->password, $user->password)) { // 错误次数递增,设置缓存过期时间为锁定时长 $currentAttempts = Cache::increment($cacheKey); Cache::put($cacheKey, $currentAttempts, now()->addMinutes($lockoutMinutes)); $remainingAttempts = $maxAttempts - $currentAttempts; return response()->json([ 'message' => "密码错误,还有{$remainingAttempts}次机会" ], 401); } // 登录成功,清除错误次数缓存 Cache::forget($cacheKey); // 生成桌面应用授权token $token = $user->createToken('DesktopApp')->plainTextToken; return response()->json(['token' => $token]); }
这个方案直接绑定用户账号计数,不会影响同一IP下的其他合法用户,更适配桌面应用场景。
三、用Laravel RateLimiter自定义限流器(Laravel 8+)
Laravel 8及以上版本的RateLimiter类支持更灵活的限流规则定义:
1. 定义限流器
在app/Providers/RouteServiceProvider.php的configureRateLimiting方法中添加:
protected function configureRateLimiting() { RateLimiter::for('login', function (Request $request) { $user = User::where('email', $request->email)->first(); // 优先按用户ID限流,无匹配用户则 fallback 到IP return Limit::perMinute(5)->by($user?->id ?: $request->ip()); }); }
2. 路由中应用限流器
在登录路由上挂载自定义限流器:
Route::post('/login', [AuthController::class, 'login'])->middleware('throttle:login');
四、额外增强防护措施
- 验证码触发:当错误次数达到3次时,要求用户输入验证码(可借助Laravel生态内的验证码包实现),进一步降低暴力破解概率。
- 账号锁定机制:错误次数超限后,直接锁定账号15-30分钟,锁定状态可存在缓存或数据库中。
- 异常日志记录:记录登录失败的请求信息(IP、时间、账号),方便后续排查异常攻击行为。
内容的提问来源于stack exchange,提问作者Yili
相关产品推荐
相关产品推荐

