Foros del Web » Programando para Internet » PHP »

Dudas sobre sesiones en php

Estas en el tema de Dudas sobre sesiones en php en el foro de PHP en Foros del Web. Estoy utilizando sesiones y mi problema es: 1) Tiempo de expiración de una sesión Se que las directivas del php.ini que afectan al tiempo de ...
  #1 (permalink)  
Antiguo 12/08/2004, 07:43
 
Fecha de Ingreso: agosto-2004
Mensajes: 44
Antigüedad: 19 años, 8 meses
Puntos: 0
Dudas sobre sesiones en php

Estoy utilizando sesiones y mi problema es:
1)
Tiempo de expiración de una sesión
Se que las directivas del php.ini que afectan al tiempo de expiración de una
sesión (por defecto) son (principalmente):
session.gc_maxlifetime = 2880 (expresado en segundos) en mi caso
session.cache_expire = 1800 (expresado en segundos) en mi caso
Aun asi las sesiones expiran rapidamente, por ejemplo si el usuario deja inactivo la pagina y despues de 3 o 5 min la sesion termina.
2)
El segundo tema va por la restriccion de una sesion activa por usuario, es decir no deberian haber mas de 1 usuario conectado con la misma cuenta.

Adjunto un par de scripts que estoy utilizando(los principales):
aut_verifica.inc.php
Código:
// Motor autentificacin usuarios.

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


// chequear p�ina que lo llama para devolver errores a dicha p�ina.

$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'])) {

// Conexin 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_conexion= mysql_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�ina 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�ina 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();

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

    // Asignamos variables de sesin con datos del Usuario para el uso en el
    // resto de p�inas 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 sesin 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 {
      // 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 sesin existe -------

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

// Chequeamos si estan creadas las variables de sesin de identificacin 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;
}
}
aut_config.inc.php
Código:
// Configuracin

// Nombre de la session (puede dejar este mismo)
$usuarios_sesion="autentificator";

// Datos conexin a la Base de datos (MySql)
$sql_host="localhost";  // Host, nombre del servidor o IP del servidor Mysql.
$sql_usuario="root";        // Usuario de Mysql
$sql_pass="";           // contrasea de Mysql
$sql_db="bd1";     // Base de datos que se usar
$sql_tabla="usuarios"; // Nombre de la tabla que contendra los datos de los usuarios
  #2 (permalink)  
Antiguo 12/08/2004, 08:29
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
1) Como propagas el SID? .. en Cookies? (supongo que sí .. por qué sino "Autentificator" no te iría).

En tal caso, las cookies también tienen su própio tiempo de duración (expiración) que lo define la directiva:

session.cookie_lifetime

Por defecto suele ser de "0" (segundos) .. es decir, dicha cookie se comporta como una cookie de "sesión" donde siempre expira al cerrar la última ventana abierta de tu aplicación ... por ende el "SID" para ese cliente ya no existe .. pero sigue activo en el servidor bajo en el tiempo que define:

sesssion.gc_maxlifetime

momento en el cual (cuando se supere ese tiempo) pasa al estado "garbage": basura, listo para ser borrado el archivo físicamente del servidor según el porcentaje de veces que se inicia/continua con una sesión vía session_start() en las directivas:

session.gc_probability = 1
session.gc_divisor = 100

Al propagar el SID en cookies, tendrás que revisar también los procesos de esos PC's (navegadores concretamente) si eliminan "cookies" por alguna configuración de su navegador o similar.

2) "Autentificator" no controla el tema de "concurrencia". Si quieres puedes desarrollarlo tu mismo .. o bien buscas otro sistema de autentificación que lo haga. En el foro (aquí PHP) hemos conversado várias veces el tema de "concurrencia" y como tratarlo (en teoría) (usa el buscador).

Un saludo,

PD: Podrías haber indicado expresamente que estás usando mi script "Autentificator" .. (por qué hay más usuarios del mismo que podría aportar con sus experiencias).

Un saludo,
  #3 (permalink)  
Antiguo 12/08/2004, 08:31
 
Fecha de Ingreso: abril-2004
Ubicación: Viña del Mar
Mensajes: 16
Antigüedad: 20 años
Puntos: 0
Hola, mira yo tengo un problema parecido al tuyo, pero haber si te puedo ayudar

1)
Tiempo de expiración de una sesión
Se que las directivas del php.ini que afectan al tiempo de expiración de una
sesión (por defecto) son (principalmente):
session.gc_maxlifetime = 2880 (expresado en segundos) en mi caso
session.cache_expire = 1800 (expresado en segundos) en mi caso
Aun asi las sesiones expiran rapidamente, por ejemplo si el usuario deja inactivo la pagina y despues de 3 o 5 min la sesion termina.

Yo tengo un archivo llamado seguridad.inc el cual invoco en cada pagina php que uso (include("seguridad.inc")) y en ese archivo yo invoco el session_start(), pero además incluyo una variable llamada logintime (session_register("logintime")), a la cual le asigno el valor de time(), y pregunto si ha pasado mas de 1 hora desde la ultima vez que le asigne el tiempo, el codigo es así:

if(($LoginTime+4000) < time()) {
include("$common/expirar.php");
exit;
}

expirar.php me muestra un formulario donde pide al usuario registrarse nuevamente.

2)
El segundo tema va por la restriccion de una sesion activa por usuario, es decir no deberian haber mas de 1 usuario conectado con la misma cuenta.

Con respecto al punto 2 es dificil poder bloquearle paso, a no ser que intente desde la misma maquina logearse, mira en otro mensaje de este foro me dieron una solución, lo que podrías hacer es una tabla donde guardes las conexiones del usuario (solo puede existir una sola vez en dicha tabla), mi tabla es la siguiente:

CREATE TABLE sessiones (
USUARIO___SES VARCHAR(40) NOT NULL PRIMARY KEY,
FECHA_____SES TIMESTAMP,
ID________SES VARCHAR(80));

La idea es que cada vez que el usuario se conecte verifiques su existencia en la tabla, de ser asi entonces desvialo a otra pagina, o un mensaje de aviso indicando que no puede entrar hasta el tiempo de expiración, yo hice lo siguiente:

if($reg10=lee_registro($dbses,"sessiones","usuario ___ses='$name'")){//leo el registro
$fecha1=timestamp2ibase();//asigno el tiempo real
$fecha1=ibase2time($fecha1);//convierte el tiempo en formato unix
$fecha2=ibase2time($reg10['fecha_____ses']);//convierto la ultima fecha de conexión en formato unix
$fechatot=$fecha1 - $fecha2;//hago una resta para saber la diferencia de tiempo
if($fechatot < 3600){//si el tiempo de conexión es menor a 1 hora entonces
Header("Location: error.php");
exit;
}else{
borra_registro($dbses,"sessiones","usuario___ses=' $name'");//si ha pasado mas de 1 hora entonces lo borramos de la tabla y lo dejamos pasar
}
}

Eso es lo que estoy haciendo yo ahora, de esta manera controlo que los usuarios no puedan realizar mas de 1 logeo en la plataforma.

Ojala te sirva.

Saludos!
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 12:30.