You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何保护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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 00:01:11