[yii2] Mostrar captcha após tentativa de login com falha

105
yii2 captcha
yii2 captcha

Se você tiver uma página de login que possa ser acessada pela Internet, em algum momento essa página será atacada. O motivo disso é que é muito fácil para um invasor fazer isso.

Os ataques de força bruta são tentativas de obter acesso a uma conta adivinhando o nome de usuário e a senha usados. O ataque de força bruta é, na verdade, uma técnica antiga no crime cibernético. No entanto, ela ainda é amplamente usada porque é considerada eficaz.

Uma maneira de proteger um site contra ataques de força bruta é usar um captcha (Completely Automated Public Test to Tell Computers and Humans Apart). Neste tutorial, aprenderemos a ativar o captcha depois que o usuário não conseguir fazer login. Para saber como criar um captcha, você pode ler em [yii2]Create a Login Form with Captcha.

Etapas para ativar o captcha depois que o usuário não conseguir fazer login:

1. Adicionar campos captcha e regras de validação a models/LoginForm.php

class LoginForm extends Model
{
    .............
    .............
    public $verifyCode;
    .............
  
    public function rules()
    {
        return [
            .............
            .............
  
            ['verifyCode', 'required', 'when'=>function(){return $this->loginFailed;}],
            ['verifyCode', 'captcha', 'when'=>function(){return $this->loginFailed;}],
              
            .............
            .............
        ];
    }
 
    public function validatePassword($attribute, $params)
    {
        if (!$this->hasErrors()) {
            .............
            if (!$user || !$user->validatePassword($this->password)) {
 
                Yii::$app->session->set('_loginAttempts', Yii::$app->session->get('_loginAttempts', 0)+1);
 
                .............
            }
        }
    }   
     
    //Check number login failed
    public function getLoginFailed()
    {
        return Yii::$app->session->get('_loginAttempts', 0) > 3;
    }
     
    .............
    .............   
}

2. Adicionar widgets ao views/site/login.php

.............
.............
 
<div class="site-login">
    .............
    .............
 
    <div class="row">
        <div class="col-lg-5">
            <?php $form = ActiveForm::begin(['id' => 'login-form']); ?>
 
                .............
                .............
 
                <?php
                if($model->loginFailed){
                    echo $form->field($model, 'verifyCode')->widget(\yii\captcha\Captcha::class);
                }
                ?>
 
                .............
                .............
     
            <?php ActiveForm::end(); ?>
        </div>
    </div>
</div>

3. Adicionar ação ao controlador/SiteController.php

Para que os captchas funcionem, você precisará adicionar uma ação captcha ao controllers/SiteController.php. Talvez a ação já exista porque o modelo de aplicativo padrão Yii2 adiciona-o automaticamente.

.............
.............
  
class SiteController extends Controller
{
    .............
    .............
      
    public function actions()
    {
        return [
            .............
            .............
              
            'captcha' => [
                'class' => 'yii\captcha\CaptchaAction',
            ],
            .............
            .............
        ];
    }
      
    .............
    .............   
}