[yii2] Mostrar captcha después de un intento fallido de inicio de sesión

Si tiene una página de inicio de sesión a la que se puede acceder a través de Internet, en algún momento esa página será atacada. La razón es que para un atacante es muy fácil hacerlo.

Los ataques de fuerza bruta son intentos de acceder a una cuenta adivinando el nombre de usuario y la contraseña utilizados. El ataque de fuerza bruta es en realidad una técnica antigua en la ciberdelincuencia. Sin embargo, se sigue utilizando ampliamente porque se considera que sigue siendo eficaz.

Una forma de proteger un sitio web de los ataques de fuerza bruta es utilizar un captcha (Prueba Pública Completamente Automatizada para Diferenciar Ordenadores y Humanos). En este tutorial, aprenderemos a activar captcha después de que el usuario falle al iniciar sesión. Para saber cómo crear un captcha puedes leer en [yii2]Crear un formulario de inicio de sesión con captcha.

Steps to activate captcha after user fails to login:

1. Añadir campos captcha y reglas de validación 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. Añadir widgets a 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. Añadir acción al controlador/SiteController.php

Para que los captchas funcionen, tendrás que añadir una acción captcha a controllers/SiteController.php. Puede que la acción ya exista porque la plantilla estándar de la aplicación Yii2 la añade automáticamente.

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

Artículos más recientes