Ver Mensaje Individual
  #12 (permalink)  
Antiguo 10/01/2012, 08:17
Avatar de loncho_rojas
loncho_rojas
Colaborador
 
Fecha de Ingreso: octubre-2008
Ubicación: En el mejor lugar del mundo
Mensajes: 2.704
Antigüedad: 15 años, 6 meses
Puntos: 175
Respuesta: Bloquear usuario por un tiempo determinado luego de intentos fallidos

bueno, lo hice asi...

esta es la estructura basica de mi BD.. no lo pongo todo para guardarme ciertos datos

Código SQL:
Ver original
  1. CREATE TABLE `usuarios` (
  2. `idcliente` INT( 10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
  3. `email` VARCHAR( 100 ) NOT NULL ,
  4. `pass` VARCHAR( 50 ) NOT NULL ,
  5. `verificacion` VARCHAR( 10 ) NOT NULL ,
  6. `ultimavisita` TIMESTAMP NOT NULL ,
  7. `ultimointento` TIMESTAMP NOT NULL ,
  8. `intentos` INT NOT NULL
  9. ) ENGINE = MYISAM ;


aqui el procesador PHP que recibe la clave y contraseña:

Código PHP:
<?php
//esto lo copie de algun post del foro
session_start(); // Se destruye cualquier 
session_unset(); // session anterior antes de 
session_destroy(); // comenzar con el scrip. Esto es opcional 

include("../conn/conect.php");

//ahora si el codigo
if($_POST){
            
            
$email $_POST["username"];
            
$clave $_POST["password"];
            
//$fecha= date("d-m-y H:i");
            
            //echo getdate();
            
unset($_POST); //Se destruye el array $_POST
            
            
if(preg_match("/^(([A-Za-z0-9]+_+)|([A-Za-z0-9]+\-+)|([A-Za-z0-9]+\.+)|([A-Za-z0-9]+\++))*[A-Za-z0-9]+@((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,6}$/"$email)){
                
                
$sql_login="SELECT * FROM usuarios WHERE email LIKE '".$email."'";        
                
$resultado_login=pg_query($sql_login)or die("Error query ".pg_last_error());
                
                if(
pg_num_rows($resultado_login) == 1){
                    
                    
$fila_usuario=pg_fetch_array($resultado_loginnullPGSQL_ASSOC);
                    
                    
//obtener fecha actual para compararlo con el ultimo intento
                    
$fecha getdate();
                    
$today=($fecha["year"]."-".$fecha["mon"]."-".$fecha["mday"]." ".$fecha["hours"].":".$fecha["minutes"].":".$fecha["seconds"]);
                    
//genero una resta de la fecha actual contra el ultimo intento guardado en la BD        
                    
$datetime1 = new DateTime($today);
                    
$datetime2 = new DateTime($fila_usuario['ultimointento']);
                    
$intervalo $datetime1->diff($datetime2);
                    
                        
                    
                     if(
$fila_usuario['intentos'] < 5){
                         
                         
                                     if(
$fila_usuario['pass']== $clave){
                                         
                                            
//validamos si la cuenta ya esta verificada 
                                            
if($fila_usuario["verificacion"]=="si")
                                            {
                                                
                                                
session_start();
                                                
$_SESSION["k_username"] = $fila_usuario["nombres"].", ".$fila_usuario["apellidos"];
                                                
$_SESSION["k_idcliente"] = $fila_usuario["idcliente"];
                                                
                                                
                                                
                                                
pg_query($conn2"UPDATE usuarios SET ultimavisita='NOW()', intentos='0' WHERE idcliente=".$fila_usuario['idcliente'])or die("Error query ".pg_last_error());
                                                
                                                
header("Location: ../clients/principal-clients.php");
                        
                                            }
//caso contrario, tiramos un mensaje de que aun no ha sido verificada la cuenta
                                            
else
                                            {
                                                echo 
"<h1>Su cuenta aun no ha sido verificada.</h1>";
                                                echo 
"<p>Si ya se ha registrado desde nuestro sitio Web:</p>";
                                                echo 
"<ul>
                                                        <li>Por favor, revise su correo electrónico.</li>
                                                        <li>Siga las instrucciones que le hemos enviado.</li>
                                                        <li>Inicie Sesi&oacute;n.</li>
                                                      </ul>"
;
                                                echo 
"<p>Caso contrario, puede <a href='registro.php'>registrarse</a> para acceder a los servicios</p>";
                                            }
                                         
                                     
                                     }else{
                                         
pg_query($conn2"UPDATE usuarios SET ultimointento='NOW()', intentos=intentos+1 WHERE idcliente=".$fila_usuario['idcliente'])or die("Error query ".pg_last_error());
                                         
                                         echo 
"<p style='font-size:14px; color:#FF0000;'>El password no es valido!!</p>";
                                         
                                         
                                         
$cn pg_query("SELECT * FROM usuarios WHERE idcliente=".$fila_usuario['idcliente'])or die("Error query ".pg_last_error());
                                         
$rspg_fetch_array($cn);
                                        
                                         echo 
"<p>Recuerde que s&oacute;lo posee <strong>5 intentos</strong> para ingresar a su cuenta correctamente.</p>";
                                         echo 
"<p>Este es su intento N&deg;: <span style='font-size:15px;'>".$rs['intentos']."</span></p>";
            
                                     }
//fin verificacion de correcto logueo a traves del password
                         

                         
}else{
                             
                             
//primero comparamos si y han pasado mas de 24hs desde el ultimo intento fallido
                             
if($intervalo->format('%a')>1){
                                    
pg_query($conn2"UPDATE usuarios SET intentos='1' WHERE idcliente=".$fila_usuario['idcliente'])or die("Error query ".pg_last_error());    
                                    echo 
"<h2>Hemos desbloqueado su cuenta nuevamente</h2>";
                                    echo 
"<p>Han pasado 24hs. del bloqueo de su cuenta. Por favor, ingrese nuevamente el usuario y clave de ingresos</p>";
                                }else{
                                    
//caso contrario le decimos que la cuenta aun esta bloqueada
                                    
header("Location: ../pages/cuenta-bloqueada.php");
                                }
                         }
//fin verificacion de numero de intentos
                    
                     
                    
                
}else{
                    echo 
"<p>La direccion de email ingresada no esta registrada</p>";
                    
                }
                
                
            
            }else{
                echo 
"<p>Ingrese una direccion de email valida</p>";
            }
            
            
            
        }else{
            
            
header("Location: ../index.php");
        }



?>
Bueno, yo uso postgres en vez de MySql.. pero es similar... en las funciones predeterminadas de php en vez de pg se utiliza el mysql.. o sea en pg_query o pg_fetch_array se lo cambian nomas a mysql_query o mysql_fetch_array... ya lo van a ir pillando.. seguro tiene alguno que otro defectito, pero si lo quieren mejorar bienvenido sea

espero les sirva
__________________
Ayudo con lo que puedo en el foro, y solo en el foro.. NO MENSAJES PRIVADOS.. NO EMAILS NI SKYPE u OTROS.

Antes de hacer un TOPICO piensa si puedes hallarlo en Google o en el Buscador del Foro...