Ver Mensaje Individual
  #1 (permalink)  
Antiguo 06/10/2010, 09:15
xd_cat
 
Fecha de Ingreso: octubre-2010
Mensajes: 1
Antigüedad: 14 años, 1 mes
Puntos: 0
Bucle de redireccionamiento por culpa de autenticación php

Buenas.

Seguí un tutorial, para crear un sistema de autenticación para mi web. Y desde que lo tengo montado, el navegador me da a veces errores de bucle de redireccionamiento. Os muestro los codigos, a ver si me podeis ayudar a ver donde esta el error.

Voy a resumir brevemente como me gustaría que quedara el proceso. Y como debería funcionar... Para que no tengáis que leeros todo el código...

1º En index.php se comprueba si el usuario se ha logeado hace poco tiempo, mirando en el cookie (loginUsuario). Si es así, se le envía a inicio.php. Si no se le ha enviado a inicio.php, se comprueba si el usuario tiene en su sistema unas cookie que se guardan para no tener que logearse al acceder. Si posee estas cookie, se le envía a inicio. Si no se le ha enviado a inicio.php en ninguno de los dos casos anteriores, se le muestra el formulario para ingresar los datos.

2º El formulario es enviado a control.php, se comprueban los datos, si no están en la base de datos, se le envía a index.php. Si los datos se encuentran en la base de datos, comprobamos si el usuario quiso recordar la sesión, para crear las cookie que se compruban en index.php. Hecho esto, creamos la cookie (loginUsuario) indicando en ella que usuario ha sido verificado y la fecha del ultimo acceso. Terminado esto enviamos al usuario a inicio.php.

3º En inicio.php esta incluida, seguridad.php, y antes de nada accede a ella, en esta ultima web, se comprueba si el usuario ha accedido mediante el método de autenticación, mirando el valor del campo "autenticado" en la cookie (loginUsuario), si esta autenticado, comprueba que no halla pasado 10 minutos desde que el usuario se logeo, si no han pasado, reinicia el tiempo que el usuario lleva logeado y continua con el codigo de inicio.php
Si en caso contrario si han pasado 10 minutos, se manda al usuario a index.php, a no ser que el usuario tenga las cookie para recordar la sesion, en este caso reiniciamos el tiempo de logeo y continua con el codigo de inicio.php

index.php
Código PHP:
<?php
    
include("config.php");
    include(
"funciones.php");
    
$conexion=conectar();

    
//si es necesario cambiar la config. del php.ini desde tu script
    
ini_set("session.use_only_cookies","1"); 
    
ini_set("session.use_trans_sid","0"); 

    
//iniciamos la sesión 
    
session_name("loginUsuario"); 
    
session_start(); 
    
session_set_cookie_params(0"/"$HTTP_SERVER_VARS["HTTP_HOST"], 0); 
    
//cambiamos la duración a la cookie de la sesión 

    //antes de hacer los cálculos, compruebo que el usuario está logueado 
    //utilizamos el mismo script que antes 
    
if ($_SESSION["autentificado"] == "SI") {

        
//si no está logueado lo envío a la página de autentificación 
        
header("Location: inicio.php"); 
    } 

    
//primero tengo que ver si el usuario está memorizado en una cookie
    
if (isset($_COOKIE["id_usuario_dw"]) && isset($_COOKIE["marca_aleatoria_usuario_dw"])){

        
//Tengo cookies memorizadas
        //además voy a comprobar que esas variables no estén vacías
        
if ($_COOKIE["id_usuario_dw"]!="" || $_COOKIE["marca_aleatoria_usuario_dw"]!=""){

            
//Voy a ver si corresponden con algún usuario
            
$ssql "select * from usuario where id_usuario=" $_COOKIE["id_usuario_dw"] . " and cookie='" $_COOKIE["marca_aleatoria_usuario_dw"] . "' and cookie<>''";
            
$rs mysql_query($ssql,$conexion);
            if (
mysql_num_rows($rs)==1){

                
//Tengo un usuario correcto en una cookie</b>";
                
$usuario_encontrado mysql_fetch_object($rs);
                
$id_logeado $usuario_encontrado->id_usuario;
                
$usuario_logeado $usuario_encontrado->usuario;
                
mysql_free_result($rs); 
                
mysql_close($conexion);
                
header ("Location: inicio.php");
            }
        }
    }
?>
control.php
Código PHP:
<?php
    
include("config.php");
    include(
"funciones.php");
    
$conexion=conectar();

    
//Sentencia SQL para buscar un usuario con esos datos 
    
$ssql "select * from usuario where usuario = '" $_POST["usuario"] . "' and clave='" $_POST["clave"] . "'";

    
//Ejecuto la sentencia 
    
$rs mysql_query($ssql,$conexion); 

    
//si es necesario cambiar la config. del php.ini desde tu script
    
ini_set("session.use_only_cookies","1"); 
    
ini_set("session.use_trans_sid","0"); 

    
//vemos si el usuario y contraseña es váildo 
    //si la ejecución de la sentencia SQL nos da algún resultado 
    //es que si que existe esa conbinación usuario/contraseña 
    
if (mysql_num_rows($rs)!=0){

        
//He detectado un usuario
        
$usuario_encontrado mysql_fetch_object($rs);

        
//ahora debo de ver si el usuario quería memorizar su cuenta en este ordenador
        
if ($_POST["guardar_clave"]=="1"){

            
//es que pidió memorizar el usuario
            //1) creo una marca aleatoria en el registro de este usuario
            //alimentamos el generador de aleatorios
            
mt_srand (time());

            
//generamos un número aleatorio
            
$numero_aleatorio mt_rand(1000000,999999999);

            
//2) meto la marca aleatoria en la tabla de usuario
            
$ssql "update usuario set cookie='$numero_aleatorio' where id_usuario=" $usuario_encontrado->id_usuario;
            
mysql_query($ssql);

            
//3) ahora meto una cookie en el ordenador del usuario con el identificador del usuario y la cookie aleatoria
            
setcookie("id_usuario_dw"$usuario_encontrado->id_usuario time()+(60*60*24*365));
            
setcookie("marca_aleatoria_usuario_dw"$numero_aleatoriotime()+(60*60*24*365));
        }

 
        
//asigno un nombre a la sesión para poder guardar diferentes datos
        
session_name("loginUsuario"); 

        
// inicio la sesión 
        
session_start(); 

        
//cambiamos la duración a la cookie de la sesión 
        
session_set_cookie_params(0"/"$HTTP_SERVER_VARS["HTTP_HOST"], 0); 

        
//defino la sesión que demuestra que el usuario está autorizado 
        
$_SESSION["autentificado"]= "SI"

        
//defino la fecha y hora de inicio de sesión en formato aaaa-mm-dd hh:mm:ss 
        
$_SESSION["ultimoAcceso"]= date("Y-n-j H:i:s"); 

        
mysql_free_result($rs); 
        
mysql_close($conexion);
        
header ("Location: inicio.php");     
    }else { 
           
        
//si no existe le mando otra vez a la portada
           
header("Location: index.php?errorusuario=si"); 
    } 
?>
seguridad.php
Código PHP:
<?php
    
//si es necesario cambiar la config. del php.ini desde tu script 
    
ini_set("session.use_only_cookies","1"); 
    
ini_set("session.use_trans_sid","0"); 

    
//iniciamos la sesión 
    
session_name("loginUsuario"); 
    
session_start(); 
    
session_set_cookie_params(0"/"$HTTP_SERVER_VARS["HTTP_HOST"], 0); 
    
//cambiamos la duración a la cookie de la sesión 

    //antes de hacer los cálculos, compruebo que el usuario está logueado 
    //utilizamos el mismo script que antes 
    
if ($_SESSION["autentificado"] != "SI") {

        
//si no está logueado lo envío a la página de autentificación 
        
header("Location: index.php?errorusuario=si"); 
    } else {

        
//sino, calculamos el tiempo transcurrido 
        
$fechaGuardada $_SESSION["ultimoAcceso"]; 
        
$ahora date("Y-n-j H:i:s"); 
        
$tiempo_transcurrido = (strtotime($ahora)-strtotime($fechaGuardada)); 

        
//comparamos el tiempo transcurrido 
        
if($tiempo_transcurrido >= 600) { 

            
//primero tengo que ver si el usuario está memorizado en una cookie
            
if (isset($_COOKIE["id_usuario_dw"]) && isset($_COOKIE["marca_aleatoria_usuario_dw"])){

                
//Tengo cookies memorizadas
                //además voy a comprobar que esas variables no estén vacías
                
if ($_COOKIE["id_usuario_dw"]!="" || $_COOKIE["marca_aleatoria_usuario_dw"]!=""){

                    
//Voy a ver si corresponden con algún usuario
                    
$ssql "select * from usuario where id_usuario=" $_COOKIE["id_usuario_dw"] . " and cookie='" $_COOKIE["marca_aleatoria_usuario_dw"] . "' and cookie<>''";
                    
$rs mysql_query($ssql,$conexion);
                    if (
mysql_num_rows($rs)==1){

                        
//Tengo un usuario correcto en una cookie</b>";
                        
$usuario_encontrado mysql_fetch_object($rs);
                        
$id_logeado $usuario_encontrado->id_usuario;
                        
$usuario_logeado $usuario_encontrado->usuario;
                        
mysql_free_result($rs); 
                        
mysql_close($conexion);
                        
session_name("loginUsuario");
                        
session_start();
                        
$_SESSION["ultimoAcceso"] = $ahora;
                    } else {

                        
//si pasaron 10 minutos o más
                        
session_name("loginUsuario");
                        
session_start();
                        
session_destroy(); // destruyo la sesión 
                        
header("Location: index.php?errorusuario=si"); //envío al usuario a la pag. de autenticación 
                    
}
                } else {

                
//si pasaron 10 minutos o más
                
session_name("loginUsuario");
                
session_start();
                
session_destroy(); // destruyo la sesión 
                
header("Location: index.php?errorusuario=si"); //envío al usuario a la pag. de autenticación 
            
}
            } else {

                
//si pasaron 10 minutos o más
                
session_name("loginUsuario");
                
session_start();
                
session_destroy(); // destruyo la sesión 
                
header("Location: index.php?errorusuario=si"); //envío al usuario a la pag. de autenticación 
            
}
                
        }else {
            
//sino, actualizo la fecha de la sesión 
            
session_name("loginUsuario");
            
session_start();
            
$_SESSION["ultimoAcceso"] = $ahora;
        }
    }
?>
Yo por más que lo reviso, no veo por donde se puede estar redireccionando infinitamente.

Enhorabuena y muchas gracias por el foro, ayuda muchísimo.
Saludos