Foros del Web » Programando para Internet » PHP »

Limitar el numero de intentos para acceder

Estas en el tema de Limitar el numero de intentos para acceder en el foro de PHP en Foros del Web. Hola a todos/as: tengo un sistema mediante el cual para acceder a determinadas secciones es necesario tener un nombre de usuario y pass correcto. Actualmente ...
  #1 (permalink)  
Antiguo 17/03/2008, 07:09
Avatar de estibaliz2006  
Fecha de Ingreso: noviembre-2006
Mensajes: 439
Antigüedad: 18 años
Puntos: 1
Limitar el numero de intentos para acceder

Hola a todos/as: tengo un sistema mediante el cual para acceder a determinadas secciones es necesario tener un nombre de usuario y pass correcto. Actualmente lo que hago es que si lo que introduce es correcto accede a esas secciones y si no, lo lleva a una página de error. Todo esto lo comprueba en una base de datos en una tabla llamada usuarios con un usuario y un password.

lo que yo quiero es lo siguiente:

alguien trata de acceder. mete un usuario y un pass. si son incorrectos, que no lo lleve a la página de error si no concederle otro intento y continuar en la página de login. si nuevamente es erroneo hacer lo mismo y al tercer intento si sigue siendo erroneo, entonces llevarlo a la página de error y que no pueda visualizar más la página de login por mucho que quiera escribir su ruta en la barra de tareas. es decir, que aunque la escriba, detecte que ya ha hecho los tres intentos y redireccione a la página de error.

cómo lo hago?

gracias a todos/as
  #2 (permalink)  
Antiguo 17/03/2008, 07:56
 
Fecha de Ingreso: septiembre-2003
Mensajes: 96
Antigüedad: 21 años, 2 meses
Puntos: 3
Re: Limitar el numero de intentos para acceder

Bueno, pues veamos...

Deberías utilizar cookies para ello. De manera que declares una cookie "access_error" aumentando su contador.

Código PHP:
if (!isset($_COOKIE['access_error'])) 
set_cookie("access_error"); 
Al comienzo de la página de login, comprobar el valor de esa cookie, y si es mayor o igual a 3, redirigirle a la página de error.

Código PHP:
if (isset($_COOKIE['access_error']) && $_COOKIE['access_error'] >= 3)
header("Location: error.php"); 
Lo malo de esta solución, es que cuando el usuario borre las cookies de su navegador o acceda desde otro PC, podrá acceder de nuevo a la página de login.

Lo que podrías hacer es bloquear el usuario en la base de datos (le añades dos campos, uno es intentos y otro max_intentos. Cada vez que falle el login, aumentas intentos en una unidad y cuando consiga acceder el usuario lo pones a 0. Cuando intentos sea >= a max_intentos --> cuenta bloqueada.
  #3 (permalink)  
Antiguo 17/03/2008, 08:09
Avatar de david_M_G  
Fecha de Ingreso: febrero-2005
Mensajes: 938
Antigüedad: 19 años, 9 meses
Puntos: 20
Re: Limitar el numero de intentos para acceder

Con Cookie es una opción, aunque las cookies pueden eliminarse y esto dejaría de limitar los intentos.

En la base de datos del usuario (donde verificas usuario y contraseña) puedes añadir dos nuevas columnas: intentos y intento_fecha

En intentos pones valor inicial 0, y que incremente por cada intento fallido. Compruebas si es mayor que 3 (o los que quieras) y, si lo es, no le dejas al usuario seguir.

En intento_fecha guardas la fecha del último intento, para compararlo con la fecha actual. Con esto consigues que esté un tiempo sin poder intentarlo de nuevo. (Si ha pasado el tiempo asegúrate de poner intentos a 0 otra vez para volver a contar)

Suerte
  #4 (permalink)  
Antiguo 17/03/2008, 08:21
Avatar de hulray  
Fecha de Ingreso: septiembre-2006
Mensajes: 630
Antigüedad: 18 años, 2 meses
Puntos: 3
Re: Limitar el numero de intentos para acceder

Ve si te sirve este, saludos

Código PHP:
<?

session_start
(); // Se destruye cualquier
session_unset(); // session anterior antes de
session_destroy(); // comenzar con el scrip. Esto es opcional

if($_POST){ /// Se comrpueba si $_POST tiene algun valor
    /// Valores enviados por POST ///////////////////////////////////////
    
$nick $_POST['nick']; // pasamos $_POST['nick'] a $nick
    
$pass md5($_POST['pass']); // pasamos $_POST['pass'] a $pass codificado en MD5 que es como estan guardadas la pass en la BD. 
    /////////////////////////////////////////////////////////////////////
    
unset($_POST); /// Se destruye el array $_POST que ya no lo necesitamos
    /////////////////////////////////////////////////////////////////////
    
if(eregi("^[-_A-Z0-9]{3,20}$",$nick)){ // Se comprueba si el nick es valido. ( Valido: entre 3 y 20 caracteres que sean '-', '_', de la 'A' a la 'Z' y 0 al 9 )
        /// SQL ////////////////////////////////////////////////////////////////////    
        
include("conexion.php"); // Conexion a la BD.
        /// Buscamos el registro en la BD que conincida con $nick. Solo buscamos un registro, por eso LIMIT 1
        
$resp mysql_query("SELECT id_usuario,nick,pass,intentos,nivel,direccion,mail,celular,telefono,fax FROM usuarios WHERE nick='$nick' LIMIT 1",$conexion);
        
////////////////////////////////////////////////////////////////////////////
        
if(mysql_num_rows($resp) == 1){ /// Se comprueba si dio un resultado
            /// Si da un resultado es que existe tal usuario ...
            
$row mysql_fetch_assoc($resp); /// ... guardamos los valores del registro en la variable $row
            
if($row['intentos'] < 5){ /// Ahora comprobamos si tiene menos de 5 intentos fallidos de conexion.
                /// En el caso de tener menos de 5 intentos, se comprueba si la contraseña es correcta
                
if($pass == $row['pass']){
                    
/// Si la contraseña es correcta ...
                    
session_start(); /// Se inicia la session
                    
$_SESSION['id_usuario'] = $row['id_usuario']; /// Variable de session que contiene la ID del usuario, ideal para autorizar a zonas restringidas
                    
$_SESSION['usuario'] = $row['nick']; /// Variable de session que contiene el nombre del usuario
                    
$_SESSION['usuario_nivel'] = $row['nivel'];
                    
                    
/// Ahora actualizamos el registro del usuario, con la fecha de la ultima conexion y la ultima ip,
                    /// ademas sumamos en +1 las conexiones que lleva el usuario en total desde su resgitro y ponemos los intentos fallidos a 0
                    
$fecha time(); // fecha en formato timestamp.
                    
$ip "xxx.xxx.xxx.xxx"/// Ip del usuario, esto en si no vale de nada es un hueco para poner
                                             /// una funcion que obtenga la ip mas adelante cuando haga la funcion, pero mientras tengo que usar un IP
                    /// SQL ///////////////////////////////////////////////////////////
                    
mysql_query("UPDATE usuarios SET uconexion_fecha='$fecha', uconexion_ip='$ip' , conexiones=conexiones+1, intentos=0 WHERE id_usuario='$row[id_usuario]' LIMIT 1",$conexion);
                    
///////////////////////////////////////////////////////////////////
                    
header("Location: /index.php"); /// una vez logueado redirigimos al usuario al index de la pagina o a su panel de control.
                
                
} else {
                    
/// Si la contraseña es incorrecta le sumamamos a los intentos +1 
                    /// SQL ///////////////////////////////////////////////////////////
                    
mysql_query("UPDATE usuarios SET intentos=intentos+1 WHERE id_usuario='$row[id_usuario]' LIMIT 1",$conexion);
                    
///////////////////////////////////////////////////////////////////
                    
echo "Contraseña incorrecta.";
                }
            } else { echo 
"Cuenta bloqueada ..."; } /// Salida para cuando supere los intentos de conexion fallidos
        
} else { echo "No existe tal usuario."; } /// Salida para cuendo no encuentre ningun usuario en la bd con el $nick enviado
    
} else { echo "Usuario no valido"; } /// Salida para cuendo el nick introducido en el formulario no sea valido
} else { header("Location: /principal.html"); } /// Salida para cuando no se envie nada por $_POST, osea que se acceda al script directamente sin usar el formulario.  


?>
  #5 (permalink)  
Antiguo 22/01/2009, 17:33
 
Fecha de Ingreso: agosto-2008
Ubicación: Buenos Aires
Mensajes: 247
Antigüedad: 16 años, 3 meses
Puntos: 6
Respuesta: Limitar el numero de intentos para acceder

hola a todos, me parece barbaro este aporte.

por otra parte, estaba interesado en ver como adaptar el segundo codigo, para que permita hasta 3 intentos de login cada 15 minutos, y en caso de cumplirse los 3 intentos dsin loguearse, te bannea por 15 min...


pero no se bien como agregar algo asi al codigo... me pueden dar una mano???¿?



Muchas Gracias de Antemano.

Saludos y suerte.
  #6 (permalink)  
Antiguo 23/01/2009, 02:50
 
Fecha de Ingreso: septiembre-2003
Mensajes: 96
Antigüedad: 21 años, 2 meses
Puntos: 3
Respuesta: Limitar el numero de intentos para acceder

Pues (sin haberme leído el código porque no tengo tiempo...) digamos que en la tabla de usuarios debes tener dos campos: Intentos y Fecha_último_intento.

Entonces al consultar el login, si es exitoso, actualizas el campo intentos a 0.
Si no lo es, entonces incrementas el campo intentos en una unidad y actualizas la fecha del último intento a este mismo instante.

Y para la consulta de login, debes hacer algo así como:

SELECT * FROM usuarios WHERE username = '$username' AND password = '$password' AND (intentos < 3 OR (intentos >= 3 AND NOW() > DATE_ADD(fecha_ultimo_intento, INTERVAL 15 MINUTES))

(es decir que username y password sean ok, y que o bien los intentos sean menos que 3 o que sean >= 3 y hayan pasado más de 15 minutos desde el último intento)

Espero haberte ayudado.
Un saludo
  #7 (permalink)  
Antiguo 23/01/2009, 07:06
 
Fecha de Ingreso: agosto-2008
Ubicación: Buenos Aires
Mensajes: 247
Antigüedad: 16 años, 3 meses
Puntos: 6
Respuesta: Limitar el numero de intentos para acceder

si, pero el problema de eso es:
yo me logueo mal ahora... ya gaste 1 intento
me logueo mal mañana... ya gaste el 2º intento
y lo hago nuevamente pasado mañana.... y me bannea 15minutos....

yo estaba pensando en algo del estilo.... qu registro los 3 ultimos intento..... y verifique si fuerion en los ultimos 15 minutos.......

osea..... te permite 12 intentos por hora.... (3 cada 15 min...) y si los superas, te bannea por 15 min....

eso me parece que es mas complicado....... y no se como encarar eso...


Muchas Gracias por la Ayuda y suerte.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:06.