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_aleatorio, time()+(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