是否可以使用Laravel的Authenticating A User With Conditions来防止蛮力攻击?
这个answer for PHP建议在数据库中添加两列(TimeOfLastFailedLogin
和NumberOfFailedAttempts
),然后在每次登录尝试时检查这些值。
以下是使用条件验证用户的Laravel语法:
if (Auth::attempt(array('email' => $email, 'password' => $password, 'active' => 1)))
{
// The user is active, not suspended, and exists.
}
有没有办法使用条件参数来检查指定时间段内的尝试次数?例如,在过去60秒内少于3个请求。
答案 0 :(得分:9)
您可以创建与下面的类一样简单的内容,以帮助您防止:
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这样的包来控制你的限制。 Sentry是开源的。
答案 1 :(得分:3)
我知道这是一个古老的问题,但由于它在Google上的排名很好,我想澄清一下自从Laravel 5.1以来特征ThrottlesLogins一直存在,并确实可以防止暴力攻击。
默认情况下,它通过特征AuthenticatesUser包含在Auth \ LoginController中。
文档:https://laravel.com/docs/5.6/authentication#login-throttling
默认行为示例(请参阅方法“登录”):https://github.com/laravel/framework/blob/5.6/src/Illuminate/Foundation/Auth/AuthenticatesUsers.php
因此,如果您使用的是Laravel附带的默认loginController,那么登录throtteling的处理将自动完成。