Предотвращение атак методом грубой силы при аутентификации пользователя в Laravel

Можно ли использовать Laravel’s Аутентификация пользователя с условиями предотвратить атаки грубой силы?

это ответ для PHP, предлагает добавить две колонки в вашу базу данных (TimeOfLastFailedLogin а также NumberOfFailedAttempts), а затем проверять эти значения при каждой попытке входа в систему.

Вот синтаксис Laravel для аутентификации пользователя с условиями:

if (Auth::attempt(array('email' => $email, 'password' => $password, 'active' => 1)))
{
// The user is active, not suspended, and exists.
}

Есть ли способ использовать параметры условия для проверки количества попыток за указанный период времени? Например, менее 3 запросов за последние 60 секунд.

5

Решение

Я знаю, что это старый вопрос, но, поскольку он занимает хорошие позиции в Google, я хотел бы пояснить, что черта ThrottlesLogins существует со времен Laravel 5.1 и предотвращает атаки методом перебора.

Он включен в Auth \ LoginController по умолчанию через черту AuthenticatesUser.

Docs: https://laravel.com/docs/5.6/authentication#login-throttling

Пример поведения по умолчанию (см. Метод «login»): https://github.com/laravel/framework/blob/5.6/src/Illuminate/Foundation/Auth/AuthenticatesUsers.php

Так что если вы используете loginController по умолчанию, который поставляется с Laravel, то обработка регулирования входа в систему будет выполняться автоматически.

2

Другие решения

Вы можете создать что-то такое же простое, как класс ниже, чтобы предотвратить это:

class Login {

public function attempt($credentials)
{
if ( ! $user = User::where('email' => $credentials['email'])->first())
{
//throw new Exception user not found
}

$user->login_attempts++;

if ($user->login_attempts > 2)
{
if (Carbon::now()->diffInSeconds($user->last_login_attempt) < 60)
{
//trow new Exception to wait a while
}

$user->login_attempts = 0;
}

if ( ! Auth::attempt($credentials))
{
$user->last_login_attempt = Carbon::now();

$user->save();

//trow new Exception wrong password
}

$user->login_attempts = 0;

$user->save();

return true;
}

}

Или вы можете пойти с пакетом, как караул, который контролирует дросселирование для вас. Sentry с открытым исходным кодом.

9