Foros del Web » Programando para Internet » PHP »

ayuda con sesiones

Estas en el tema de ayuda con sesiones en el foro de PHP en Foros del Web. Hola Tengo un problema, estoy usando el autentificador de Cluster, y quiero que las sesiones expiren en un tiempo de 10 minutos, esto lo he ...
  #1 (permalink)  
Antiguo 08/05/2006, 09:42
 
Fecha de Ingreso: mayo-2006
Mensajes: 3
Antigüedad: 11 años, 7 meses
Puntos: 0
ayuda con sesiones

Hola

Tengo un problema, estoy usando el autentificador de Cluster, y quiero que las sesiones expiren en un tiempo de 10 minutos, esto lo he logrado insertando pedazos de otro codigo. El problema esta, cuando la session expira, la pagina sigue donde la deje, y cuando la persona le da click al link sale Error 404, lo que quiero hacer es q cuando la sesion expire se vaya automaticamente a una pagina que diga su sesion ha expirado, o cuando le de click a un link.
Soy nueva en php.

Gracias de antemano

verificador.php
Código PHP:
<?
 
// Motor autentificación usuarios.

// Cargar datos conexion y otras variables.
require ("aut_config.inc.php");


// chequear página que lo llama para devolver errores a dicha página.

$url explode("?",$_SERVER['HTTP_REFERER']);
$pag_referida=$url[0];
$redir=$pag_referida;
// chequear si se llama directo al script.
if ($_SERVER['HTTP_REFERER'] == ""){
die (
"Error cod.:1 - Acceso incorrecto!");
exit;
}

// Chequeamos si se está autentificandose un usuario por medio del formulario
if (isset($_POST['user']) && isset($_POST['pass'])) {


// Conexión base de datos.
// si no se puede conectar a la BD salimos del scrip con error 0 y
// redireccionamos a la pagina de error.
$db_conexionmysql_connect("$sql_host""$sql_usuario""$sql_pass") or die(header ("Location:  $redir?error_login=0"));
mysql_select_db("$sql_db");

// realizamos la consulta a la BD para chequear datos del Usuario.
$usuario_consulta mysql_query("SELECT ID,usuario,pass,nivel_acceso FROM $sql_tabla WHERE usuario='".$_POST['user']."'") or die(header ("Location:  $redir?error_login=1"));

 
// miramos el total de resultado de la consulta (si es distinto de 0 es que existe el usuario)
 
if (mysql_num_rows($usuario_consulta) != 0) {

    
// eliminamos barras invertidas y dobles en sencillas
    
$login stripslashes($_POST['user']);
    
// encriptamos el password en formato md5 irreversible.
    
$password md5($_POST['pass']);

    
// almacenamos datos del Usuario en un array para empezar a chequear.
     
$usuario_datos mysql_fetch_array($usuario_consulta);
  
    
// liberamos la memoria usada por la consulta, ya que tenemos estos datos en el Array.
    
mysql_free_result($usuario_consulta);
    
// cerramos la Base de dtos.
    
mysql_close($db_conexion);
    
    
// chequeamos el nombre del usuario otra vez contrastandolo con la BD
    // esta vez sin barras invertidas, etc ...
    // si no es correcto, salimos del script con error 4 y redireccionamos a la
    // página de error.
    
if ($login != $usuario_datos['usuario']) {
           
Header ("Location: $redir?error_login=4");
        exit;}

    
// si el password no es correcto ..
    // salimos del script con error 3 y redireccinamos hacia la página de error
    
if ($password != $usuario_datos['pass']) {
        
Header ("Location: $redir?error_login=3");
        exit;}

    
// Paranoia: destruimos las variables login y password usadas
    
unset($login);
    unset (
$password);

    
// En este punto, el usuario ya esta validado.
    // Grabamos los datos del usuario en una sesion.
    
     // le damos un mobre a la sesion.
    
session_name($usuarios_sesion);
     
// incia sessiones
    
session_start();

//defino la sesión que demuestra que el usuario está autorizado
$_SESSION["ultimoAcceso"]= date("Y-n-j H:i:s");
//defino la fecha y hora de inicio de sesión en formato aaaa-mm-dd hh:mm:ss
header ("Location: ../page/info/datatapekey.php");

    
// Paranoia: decimos al navegador que no "cachee" esta página.
    
session_cache_limiter('nocache,private');
    
    
// Asignamos variables de sesión con datos del Usuario para el uso en el
    // resto de páginas autentificadas.

    // definimos usuarios_id como IDentificador del usuario en nuestra BD de usuarios
    
$_SESSION['usuario_id']=$usuario_datos['ID'];
    
    
// definimos usuario_nivel con el Nivel de acceso del usuario de nuestra BD de usuarios
    
$_SESSION['usuario_nivel']=$usuario_datos['nivel_acceso'];
    
    
//definimos usuario_nivel con el Nivel de acceso del usuario de nuestra BD de usuarios
    
$_SESSION['usuario_login']=$usuario_datos['usuario'];

    
//definimos usuario_password con el password del usuario de la sesión actual (formato md5 encriptado)
    
$_SESSION['usuario_password']=$usuario_datos['pass'];


    
// Hacemos una llamada a si mismo (scritp) para que queden disponibles
    // las variables de session en el array asociado $HTTP_...
    
$pag=$_SERVER['PHP_SELF'];
    
Header ("Location: $pag?");
    exit;
    

    
   } else {
   
//-------------- test de time
//si no existe le mando otra vez a la portada
header("Location: ../page/info/datatapekey.php");

   
      
// si no esta el nombre de usuario en la BD o el password ..
      // se devuelve a pagina q lo llamo con error
      
Header ("Location: $redir?error_login=2");
      exit;}
} else {

// -------- Chequear sesión existe -------

// usamos la sesion de nombre definido.
session_name($usuarios_sesion);
// Iniciamos el uso de sesiones
session_start();


// ---------------------- test time
//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 >= 180) {
//si pasaron 3 minutos o más
session_destroy(); // destruyo la sesión
header("Location:  info/datatapekey.php"); //envío al usuario a la pag. de autenticación
//sino, actualizo la fecha de la sesión
}else {
$_SESSION["ultimoAcceso"] = $ahora;
}
// 


//----------------------- test time

// Chequeamos si estan creadas las variables de sesión de identificación del usuario,
// El caso mas comun es el de una vez "matado" la sesion se intenta volver hacia atras
// con el navegador.

if (!isset($_SESSION['usuario_login']) && !isset($_SESSION['usuario_password'])){

//Borramos la sesion creada por el inicio de session anterior
session_destroy();
die (
"Error cod.: 2 - Acceso incorrecto!");
exit;
}
}
?>

Última edición por Cluster; 08/05/2006 a las 09:52
  #2 (permalink)  
Antiguo 08/05/2006, 10:07
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Definiendo una variable de sesión con un tiempo en ella y luego validando ese tiempo de tu variable de sesión .. no "fijas" la duración de la sesión (en tiempo) en sí. Siempre estarás a mercer de lo que php.ini: session.gc_maxtimelife defina .. de hecho si tu bajo tu sistema de expiración de sesión defines tiempos de expiración menores al que la directiva de PHP (php.ini) que menciono tengas definido .. tu sistema "podría" funcionar .. Pero insisto que esa gestión de tiempo de expiración NO es correcta.

---------------------------------

Sobre tu código actual ...

Cita:
//defino la sesión que demuestra que el usuario está autorizado
$_SESSION["ultimoAcceso"]= date("Y-n-j H:i:s");
//defino la fecha y hora de inicio de sesión en formato aaaa-mm-dd hh:mm:ss
header ("Location: ../page/info/datatapekey.php");

// Paranoia: decimos al navegador que no "cachee" esta página.
session_cache_limiter('nocache,private');

// Asignamos variables de sesión con datos del Usuario para el uso en el
// resto de páginas autentificadas.

// definimos usuarios_id como IDentificador del usuario en nuestra BD de usuarios
$_SESSION['usuario_id']=$usuario_datos['ID'];
Esa redirección header("Location: ../page/info/datatapekey.php") ahí donde está no tiene ningún sentido si el flujo del código debe continuar como es ese caso para seguir definiendo variables de sesión. De hecho esa definición de tu variable de sesión: $_SESSION["ultimoAcceso"]= date("Y-n-j H:i:s"); no deberías hacerla antes de session_cache_limiter() sino despues (junto con las otras).


Sobre el tratamiento de fechas . .no sé para que te complicas tanto con strtotiem() cuando almacenando en tu sesión en tiempo en formato "Unix" (con time()) obtienes segundos y con ellos puedes operar fácilmente.


Cita:
if($tiempo_transcurrido >= 180) {
//si pasaron 3 minutos o más
session_destroy(); // destruyo la sesión
header("Location: info/datatapekey.php"); //envío al usuario a la pag. de autenticación
//sino, actualizo la fecha de la sesión
}else {
$_SESSION["ultimoAcceso"] = $ahora;
}
Despues de cada redireccionamiento: header("Location ...") debes terminar la ejecución del script con exit; por ejemplo .. TU código debe dejar de ejecutarse en ese punto para ejecutar el que redirecionas .. Eso es lo que en principio parece que te está dando problemas o te los puede dar ..

-------------------------------------------

Como te decía anteriormente, no comparto para nada el uso y control del tiempo de expiración de sesiones como lo haces .. NO es correcto .. dependes mucho de la configuración del servidor (php.ini directiva mencionanda antes) la cual ni "fuerzas" un valor por lo menos "alto" para poder "jugar" con el tuyo que gestionas en tu sesión .. Además este tipo de control no te dá juego para "eventualmente" "matar" una sesión o variable concreta arbitariamente.

Intenta ver otros sistemas de gestión de sesiones que incorporen control de tiempo de expiración. y luego sobre ese sistema .. desarrollas tu sistema de autentificación de usuarios (en base a "Autentitificator" si lo deseas .. es bien siemple el sistema . .pero sustituyendo el uso de sesiones "clásico" de PHP por el que defina ese otro sistema).

Por ejemplo, AdoBD tiene un módulo para gestión de sesiones bastante avanzado, almacena su información (las de las sesiones) en BBDD (contra PHP por defecto que lo hace en archivos de texto plano) .. así tienes un mayor control de la sesión .. por ejemplo "cuanto" tiempo le queda a la sesión para expirar .. "matar" una sesión cuando quieras .. etc.

AdoDB
http://phplens.com/lens/adodb/docs-session.htm


Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #3 (permalink)  
Antiguo 08/05/2006, 10:37
 
Fecha de Ingreso: mayo-2006
Mensajes: 3
Antigüedad: 11 años, 7 meses
Puntos: 0
Hola Cluster

Gracias por la explicación, pero como leiste arriba, no estoy muy experta con esto del php.

He buscado por internet las maneras de expirar sesiones, y siempre me sale el mismo ejemplo.

Te agradeceria si me podrias hechar una mano
  #4 (permalink)  
Antiguo 08/05/2006, 11:14
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Cita:
Iniciado por dd20
Hola Cluster

Gracias por la explicación, pero como leiste arriba, no estoy muy experta con esto del php.

He buscado por internet las maneras de expirar sesiones, y siempre me sale el mismo ejemplo.

Te agradeceria si me podrias hechar una mano
El link que te dejé tienes un excelente sistema de gestión de sesiones que sutituye al clásico manejo de sesiones (en parte) de PHP por uno más avanzado.

Usalo o simplemente tendrás que jugar con el valor de "session.gc_maxtimelife" de tu PHP.ini .. el cual es un valor "general" para toda sesión creada en el servidor (no para manejo de sesiones individuales).

Revisa la ducumentación de PHP sobre sesiones .. es necesario leer su "teoría" (y directivas de configuración que las definen):

www.php.net/session


Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
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 00:30.