Обмежити кількість невдалих спроб - за ключем, що поєднує email та IP.
public function authenticate(): void
{
$key = Str::transliterate(Str::lower($this->input('email'))) . '|' . $this->ip();
if (RateLimiter::tooManyAttempts($key, 5)) {
throw ValidationException::withMessages([
'email' => __('auth.throttle', ['seconds' => RateLimiter::availableIn($key)]),
]);
}
if (! Auth::attempt($this->only('email', 'password'))) {
RateLimiter::hit($key);
throw ValidationException::withMessages(['email' => __('auth.failed')]);
}
RateLimiter::clear($key);
}
Чому саме такий ключ:
- Лише IP - заблокує цілий офіс за NAT, а зловмисник із сотнею адрес обійде.
- Лише email - будь-хто зможе заблокувати вхід чужому акаунту, просто вводячи неправильний пароль.
- Email + IP гальмує перебір конкретного акаунта з конкретної адреси.
Що ще допомагає:
- однакове повідомлення «Невірний email або пароль» - щоб не підказувати, які email зареєстровані;
- не блокувати акаунт назавжди після N спроб - це інструмент для атаки на доступність;
- двофакторна автентифікація, після якої перебір пароля сам по собі нічого не дає.
Стартові набори Laravel 13 вже обмежують спроби входу. Якщо застосунок за проксі (Cloudflare), перевірте довірені проксі - інакше всі запити матимуть IP проксі.