bloquear usuario con tres intentos

publicado por: Anonymous

Hola, buenas.

Disculpen que ponga esto, soy un poco nuevo en esto.

Tengo un login con php y mysql, y he querido hacer una validacion en la cual el usuario despues de intentar logear 3 veces al sistema con la contraseña incorrecta lo bloquee automaticamente, tengo una base de datos en mysql con una tabla llamada “usuario” donde esta toda la informacion del usuario como ser el nombre del usuario y la contraseña, aparte de eso añadi un campo mas que se llama “intentos” donde llevara los intentos hechos por ingresar mal los datos al sistema, cuando el usuario ingrese mal se hara un update a este campo, para llenar este campo tengo un “contador” que cada vez que el usuario ingresa mal un dato va sumando uno y una vez llegue a 3 entonces que ejecute otro update que tengo que modifica el estado del usuario a inactivo.

el problema que tengo es que, no se que estoy haciendo mal porque no me modifica los intentos en la base y el estado, tambien tengo encryptado la contraseña no se eso influye en lo que tengo.

dejo el codigo que tengo, seria de mucha ayuda si me pueden ayudar.

_x000D_

_x000D_

<?php_x000D_
try {_x000D_
    $base=new PDO("mysql:host=localhost; dbname=base_ihadfa", "root", "");_x000D_
    $base-> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);_x000D_
_x000D_
_x000D_
    //$sql="SELECT * FROM usuario WHERE Usuario= :login AND Password= SHA1('" . ":password" . "')";_x000D_
    $sql="SELECT * FROM usuario WHERE Usuario= :login AND Password= SHA1(:password)";_x000D_
_x000D_
    //consulta preparada con marcadores_x000D_
    $resultado=$base->prepare($sql);_x000D_
_x000D_
    //convertir cualquier simbolo/ capturar lo se ingreso en los textboxs_x000D_
    $login=htmlentities(addslashes($_POST["login"]));_x000D_
    $password=htmlentities(addslashes($_POST["password"]));_x000D_
_x000D_
    //bindvalue: _x000D_
    $resultado->bindvalue(":login", $login);_x000D_
    $resultado->bindvalue(":password", $password);_x000D_
    $resultado->execute();_x000D_
    //contar el numero de filas o registro de la base_x000D_
    $numero_registro=$resultado->rowCount();_x000D_
     $filas=$resultado->fetch(PDO::FETCH_ASSOC);_x000D_
_x000D_
_x000D_
//campo "intentos" de la tabla usuario inicializado en 0 -----------------------------------------------_x000D_
     $_SESSION['intentos'] = 0; _x000D_
_x000D_
 if ($numero_registro !=0) {_x000D_
 _x000D_
        //iniciar sesion_x000D_
       session_start();_x000D_
       //almacenar la session del usuario en una variable super global_x000D_
   _x000D_
        $_SESSION['idUsuario'] = $filas['ID_Usuario'];_x000D_
        $_SESSION['Nivel_Permiso']= $filas['Nivel_Permiso'];_x000D_
        $_SESSION['Estado']= $filas['Estado'];_x000D_
        $_SESSION['Password']= $filas['Password'];_x000D_
        $_SESSION['Usuario']= $filas['Usuario'];_x000D_
        _x000D_
     //Usuario inactivo_x000D_
      if ($_SESSION['Estado']=='Inactivo') {_x000D_
        //header("location:../../index.php");_x000D_
        echo "<script>swal({_x000D_
                title: 'Usuario Inactivo',_x000D_
                text: '',_x000D_
                type: 'warning',_x000D_
                confirmButtonText: 'Aceptar',_x000D_
                allowOutsideClick: false,_x000D_
                confirmButtonColor: '#0CA822'}) _x000D_
                .then((result) => { _x000D_
                window.location=window.location='http://localhost/Sistema/Cuenta/index.php'});</script>";_x000D_
      _x000D_
      }elseif($_SESSION['Estado']=='Activo')_x000D_
      {_x000D_
      //Nivel de Administrador_x000D_
        if ($_SESSION['Nivel_Permiso']=='Administrador')_x000D_
        {_x000D_
        //header("location:../../../MDI/MDI_Admin.php");_x000D_
        echo "<script>swal({_x000D_
                title: 'Bienvenido al Sistema',_x000D_
                text: '',_x000D_
                type: 'success',_x000D_
                confirmButtonText: 'Aceptar',_x000D_
                allowOutsideClick: false,_x000D_
                confirmButtonColor: '#0CA822'}) _x000D_
                .then((result) => { _x000D_
                window.location=window.location='http://localhost/Sistema/MDI/MDI_Admin.php'});</script>";_x000D_
       }  _x000D_
       elseif($_SESSION['Nivel_Permiso']=='Usuario')_x000D_
       {_x000D_
       // header("location:../../../MDI/MDI_Usuario.php"); _x000D_
_x000D_
        echo "<script>swal({_x000D_
                title: 'Bienvenido al Sistema',_x000D_
                text: '',_x000D_
                type: 'success',_x000D_
                confirmButtonText: 'Aceptar',_x000D_
                allowOutsideClick: false,_x000D_
                confirmButtonColor: '#0CA822'}) _x000D_
                .then((result) => { _x000D_
                window.location=window.location='http://localhost/Sistema/MDI/MDI_Usuario.php'});</script>";   _x000D_
          }  _x000D_
        }    _x000D_
_x000D_
     }else{_x000D_
         _x000D_
//usuario o contraseña malos------------------------------------------------_x000D_
        _x000D_
        echo  "<script>swal({_x000D_
                title: 'Usuario o contraseña incorrecto',_x000D_
                text: 'Ingrese de nuevo sus datos',_x000D_
                type: 'error',_x000D_
                confirmButtonText: 'Aceptar',_x000D_
                allowOutsideClick: false,_x000D_
                confirmButtonColor: '#E12A2A'})  _x000D_
                .then((result) => { _x000D_
                window.location=window.location='index.php'});</script>";_x000D_
//contador y update que actualiza el incremento de intentos al campo "intentos"-----------------------------_x000D_
                $_SESSION['intentos'] += 1;  _x000D_
                $sql = "UPDATE usuario SET intentos = '$_SESSION['intentos']' WHERE Usuario = '$login'";_x000D_
                _x000D_
    }_x000D_
    //bloquea al usuario--------------------------------------------------------------------_x000D_
    if ($_SESSION['intentos']==3){_x000D_
      echo "<script>swal({_x000D_
        title: 'Cuenta bloqueada',_x000D_
        text: 'Ingrese de nuevo sus datos',_x000D_
        type: 'error',_x000D_
        confirmButtonText: 'Aceptar',_x000D_
        allowOutsideClick: false,_x000D_
        confirmButtonColor: '#E12A2A'})  _x000D_
        .then((result) => { _x000D_
        window.location=window.location='index.php'});</script>";_x000D_
_x000D_
        $sql = "UPDATE usuario SET Estado = 'Inactivo' WHERE Usuario = '$login'";_x000D_
     }_x000D_
_x000D_
   _x000D_
} catch (exception $e){_x000D_
    //cuando mo conecte a la base de datos_x000D_
    die("Error: " . $e->getmessage() );_x000D_
}_x000D_
?>

_x000D_

_x000D_

_x000D_

dejo una foto de la tabla que tengo en la base de datos con mysql
base

Gracias por sus respuestas

solución

Tienes un error en la lógica, el sistema está haciendo lo que le estás pidiendo.

  • Estas intentando settear una variable de sesión
    $_SESSION['intentos'] = 0 antes del session_start()
  • Cuando se vuelve a invocar tu script, el primer comando es settear $_SESSION['intentos'] = 0, esto hará que los intentos sean infinitos
  • Siempre antes que un echo, van las instrucciones que debes hacer, lo estás haciendo mal en el paso 3, estás invocando un script que redirige a otra página, eso puede ocasionar que el PHP no termine de hacer su trabajo.
  • En ningún caso estás invocando la ejecución de tus consultas

Te propongo esta solución
antes del try

session_start();
if( array_key_exists( 'intentos', $_SESSION ) ){
    $_SESSION['intentos'] = $_SESSION['intentos'] + 1;
} else {
    $_SESSION['intentos'] = 0;
}
$sql = "UPDATE usuario SET intentos = $_SESSION['intentos'] WHERE Usuario = '$_POST['login']'";
$base->exec($sql);

Esto validará si hay ya una variable de sesión con el índice intentos, si existe, le suma 1, si no existe, la crea en 0

if( $_SESSION['intentos'] >= 3 ){
$sql = "UPDATE usuario SET Estado = 'Inactivo' WHERE Usuario = '$login'";
$base->exec($sql);
      echo "<script>swal({
        title: 'Cuenta bloqueada',
        text: 'Ingrese de nuevo sus datos',
        type: 'error',
        confirmButtonText: 'Aceptar',
        allowOutsideClick: false,
        confirmButtonColor: '#E12A2A'})  
        .then((result) => { 
        window.location=window.location='index.php'});</script>";
}

Cambié la condición que sea == 3 a que sea >= 3, si la persona por X razón vuelve a enviar la información, lo dejará pasar, puesto que $_SESSION['intentos'] valdrá 4 y romperá la condición. Por último y no menos importante, cambia que el query vaya primero Y QUE SE EJECUTE!

Eso debería resolver muchos de tus problemas

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *