Foros del Web » Programando para Internet » PHP »

Duración de sesiones

Estas en el tema de Duración de sesiones en el foro de PHP en Foros del Web. Hola a todos: Dudas en concreto: ¿Cómo puedo conocer el tiempo de vida de una sesión? ¿Cómo puedo manipular este tiempo de vida si no ...
  #1 (permalink)  
Antiguo 28/10/2006, 09:42
Avatar de Escoffie  
Fecha de Ingreso: abril-2003
Ubicación: Mérida, Yucatán
Mensajes: 242
Antigüedad: 21 años
Puntos: 9
Duración de sesiones

Hola a todos:

Dudas en concreto:
  1. ¿Cómo puedo conocer el tiempo de vida de una sesión?
  2. ¿Cómo puedo manipular este tiempo de vida si no tengo acceso al php.ini?
  3. ¿A qué valores del php.ini (usando phpinfo(); para leerlos) debo prestarles atención?
Descripción del problema:
  • Tengo un formulario donde mis clientes redactan contenido para publicar. Pueden pasar varias horas redactando antes de darle "submit".
  • El problema es que caduca la sesión (supongo que por inactividad, por no acceder a ningún vínculo) y pierden lo que han pasado largo tiempo redactando.
  • Se solucionaría si tuvieran el hábito de guardar constantemente, pero no siempre es factible reeducar al cliente.
El mismo formulario lo he usado en dos o tres servidores distintos y mientras en uno parece no tener fin hasta que se cierre manualmente la sesión o el navegador, en los otros dos dura como 30 minutos (aproximadamente).

Consideraciones:
  • No tengo acceso al php.ini, y no entiendo muy bien cuáles son los parámetros que controlan la duración de las sesiones.
  • He leído en php.net sobre el tema, pero no comprendo mucho.
  • Sí tengo acceso a archivos .htaccess y a usar php_flag.
  • Preferiría no usar ini_set() para no modificar mis scripts.

Algunos post que he leído sin entenderles mucho:

http://www.forosdelweb.com/f18/caducidad-session-417309/
http://www.forosdelweb.com/f18/configuracion-php-ini-sesiones-415276/
... y por supuesto Googleando sobre el tema, y revisando php.net sin mucho éxito :(

De antemano muchas gracias. Sé que es un tema recurrente pero no he encontrado respuestas claras para un no iniciado en esto de las sesiones.
  #2 (permalink)  
Antiguo 28/10/2006, 10:50
Avatar de Escoffie  
Fecha de Ingreso: abril-2003
Ubicación: Mérida, Yucatán
Mensajes: 242
Antigüedad: 21 años
Puntos: 9
Olvidaba algo:

Intenté previamente poner en el archivo .htaccess lo siguiente:

php_flag session.cookie_lifetime 10
php_flag session.gc_maxlifetime 10

Teóricamente la sesión debía durar 10 segundos, pero no fue así.

Veo que en los posts relacionados siempre "alargan" el tiempo en vez de reducirlo.

¿Esto quiere decir que si el servidor está configurado digamos para 24 minutos, y yo trato de reducirlo a 10 segundos lo ignorará, pero si trato de aumentarlo a 50 minutos sí lo respeta?

¿O es que a nadie se le había ocurrido hacer sus pruebas con tiempos pequeños para no sentarse a esperar por horas y yo estoy haciendo algo mal? (perdón por la rudeza)

Saludos y gracias.
  #3 (permalink)  
Antiguo 28/10/2006, 20:53
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 4 meses
Puntos: 129
Lo primero que debes conocer es que el manejo del tiempo de expiración de las sesiones que crea PHP (www.php.net/session) se hace en forma común para toda sesión abierta en un servidor determinado que ejecute PHP.

No se hace un control "individual" del tiempo de vida de una sesión determinada, tampoco se puede ver "cuanto" le queda de vida a una sesión en forma individual .. anque PHP de alguna manera gestiona dicho item.

Yo creo que llegado al punto donde estás que necesitas un control más "fino" de las sesiones que manejas ya es hora de abandonar el uso clásico de PHP y sesiones y tomar algún otro sistema mucho más "personalizable" para este tema. Por ejemplo:

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

Ahí se gestionan los datos de la sesión sobre Base de datos, puedes manipular las sesiones que se crean en forma individual, sus tiempos de expiración .. ver todas las sesiones activas sin problemas .. "matar" una sesión en forma individual o bien extender su tiempo . .o consularlo .. en fin, un control más completo de las sesiones.

Por supuesto .. todo esto tiene su "precio": Recuros del servidor .. uno uso intesivo de la BBDD para prestarte todas estas funcionalidades.

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

De todas formas .. el problema que planteas se puede manejar de otra manera:

1) Tu script que recibe los datos de tu formulario .. chequea si está activa la sesión o no .. como ya lo harás.
2) Si no está activa, almacena los datos en una Base de datos (tabla) en forma "temporal". Puede ser la misma tabla(s) donde caigan los datos pero en forma temporal, es decir, .. con un "flag" que indique que los datos no son válidos (1 valido, 0 No valido) por ejemplo.
3) Pides autentificación a tu usuario. Si pasa .. tomas los datos ingresados y los pasas al estado 1 de valido.

Por supuesto tendrás que manejar todo el tema de limpiar tus BBDD si hay datos que no se han "validado" pasado un tiempo determinado (así que otro dato más tendrás que registra: fecha que se incorpora el dato en tus BBDD).

El caso como veras es "registrar" igualmente en todos los casos la información que venga de tu formulario, pero NO como definitiva sino "temporal" .. y por otro lado "validarla" .. Esto como te comento lo puedes hacer una vez que el usuario se autentifique correctamente.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #4 (permalink)  
Antiguo 28/10/2006, 21:00
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 4 meses
Puntos: 129
Cita:
Iniciado por Escoffie Ver Mensaje
Olvidaba algo:

Intenté previamente poner en el archivo .htaccess lo siguiente:

php_flag session.cookie_lifetime 10
php_flag session.gc_maxlifetime 10

Teóricamente la sesión debía durar 10 segundos, pero no fue así.

Veo que en los posts relacionados siempre "alargan" el tiempo en vez de reducirlo.

¿Esto quiere decir que si el servidor está configurado digamos para 24 minutos, y yo trato de reducirlo a 10 segundos lo ignorará, pero si trato de aumentarlo a 50 minutos sí lo respeta?

¿O es que a nadie se le había ocurrido hacer sus pruebas con tiempos pequeños para no sentarse a esperar por horas y yo estoy haciendo algo mal? (perdón por la rudeza)

Saludos y gracias.
mm Bueno .. En los links que dejastes y que tu mismo vistes ya explico todo lo que hay que explicar .. No sé si repetirme o mejor esperar que tú hagas las preguntas -concretas- sobre lo que no entendistes.

Yo por mi parte con los cambios que en esos mismos mensajes indico ajusto el tiempo de vida de mis sesiones como quiero ... sea mayor a lo que pudiera tener por defecto PHP o mayor .. es indiferente.

Lo que pasa es que tú omites un dato muy importante. Para que la combinación: duración cookie que PHP crea para propagar el SID y duración de la sesión que crea PHP se equiparen .. TU debes propagar el SID en cookies y sólo en cookies. Esas directivas que -fijan- a PHP a propagar el SID en cookies no las indicas u omites .. así que si eso primero no está claro .. lo otro no te funcionará.

session.use_trans_sid = 0
session.use_cookies = 1
session.use_only_cookies = 1

Así forzamos a PHP para que propague el SID en cookies. (de hecho recuerdo que uno de esos mensajes que dejastes los links .. se corroboró lo que te acabo de repetir: hasta que no se indicó "session.use_only_cookies = 1" no se hizo efectivo los ajustes del tiempo de vida de las sesiones.

Por otro lado, si tu dices que no tienes acceso al php.ini (por usarn un servicio de hosting) tendrás que usar .htacces o bien php.ini personalizados (esto te lo tendría que confirmar tu proveedor) a base de php_flag o php_value e indicando todos estos cambios o mejor dicho "forzandolos".

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #5 (permalink)  
Antiguo 29/10/2006, 14:21
Avatar de Escoffie  
Fecha de Ingreso: abril-2003
Ubicación: Mérida, Yucatán
Mensajes: 242
Antigüedad: 21 años
Puntos: 9
Hola Cluster, gracias por responder

Está muy interesante lo que me comentas de Adodb, pero creo que tampoco necesito tanto control por ahora (y tampoco le entendí mucho), así que optaré por el php_value en el .htaccess.

Probé varias combinaciones de lo que me comentas y de lo que he visto en otros posts, como los que puse de referencia, y al final, después de leerlos y releerlos sigo entendiendo poco sobre las sesiones, las cookies de sesiones y los garbages, así que experimentando un poco llegué a esto dentro del archivo .htaccess, que sí funciona:

Código:
php_value session.gc_maxlifetime 90
php_value session.gc_probability 1
php_value session.gc_divisor 1
Parece funcionar bien y hace justo lo que espero que haga: matar la sesión cada 90 segundos de inactividad.

Entiendo que esta combinación de probability y divisor hace que haya 100% de probabilidad de que se elimine la sesión, pero según he leído esto baja el rendimiento del servidor, y debería estar en un 1% (1/100) pero de este modo no hace lo que quiero.

Por otro lado, probé lo que me recomendaste en el .htaccess, pero no me funcionó:

Código:
 
php_value session.use_trans_sid 0
php_value  session.use_cookies 1
php_value  session.use_only_cookies 1
php_value  session.cookie_lifetime 90
php_value session.gc_maxlifetime 90
El problema con los mensajes donde comentan tú y los demás cómo resolver esto, es que la solución está muy dispersa y encerrada entre mucha información secundaria, por tanto para los que somos neófitos en el tema, saber qué sí y qué no va o qué cosas hay que adaptar, nos cuesta trabajo.

De todos modos, según entendí, lo que hay que hacer es forzar a que la SID se propague sólo por Cookies, pero como te comento, no está funcionando.

Concretamente:
  • ¿Porqué es mejor usar el método de la SID por cookies?
  • ¿Porqué el htaccess donde está lo de las cookies no funciona, qué me sobra o qué me falta?
  • ¿Afecta mucho que deje el que sí me funcionó con el probability y el divisor en 1, aun si sólo habrán uno o dos usuarios que no entrarían a diario?
Gracias por la ayuda
  #6 (permalink)  
Antiguo 29/10/2006, 19:38
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 4 meses
Puntos: 129
No indicas la configuración de sesiones que usas exactamente .. sobre todo en el tema de la propagación del SID: cookies? o URL? .. Si tu no sabes ni que es el SID (o no lo entiendes) .. entiendo que no lo propagas manualmente, por ende dependes directamente de la configuración de PHP para saber como propagas el SID efectivamente.

Cuando dices "no funciona" .. no sé si te refieres a que las sesiones en sí no funcionan o que no obtienes los tiempos esperados en la expiración de la sesión.

Es cierto que los pasos a seguir están "dispersos" en esos mensajes del foro .. pero así lo están por qué son "preguntas" que hace la gente como es tu caso y cada uno tiene sus própios problemas particulares.

Cita:
¿Porqué es mejor usar el método de la SID por cookies?
Por seguridad. La explicación más detallada la tienes en este documento que recomienda su lectura PHP.net:

Cita:
Sessions and security
External links: Session fixation <--- Este es el documento .. un PDF.

The session module cannot guarantee that the information you store in a session is only viewed by the user who created the session. You need to take additional measures to actively protect the integrity of the session, depending on the value associated with it.

Assess the importance of the data carried by your sessions and deploy additional protections -- this usually comes at a price, reduced convenience for the user. For example, if you want to protect users from simple social engineering tactics, you need to enable session.use_only_cookies. In that case, cookies must be enabled unconditionally on the user side, or sessions will not work.

There are several ways to leak an existing session id to third parties. A leaked session id enables the third party to access all resources which are associated with a specific id. First, URLs carrying session ids. If you link to an external site, the URL including the session id might be stored in the external site's referrer logs. Second, a more active attacker might listen to your network traffic. If it is not encrypted, session ids will flow in plain text over the network. The solution here is to implement SSL on your server and make it mandatory for users.
Cita:
¿Porqué el htaccess donde está lo de las cookies no funciona, qué me sobra o qué me falta?
En un .htaccess defines según la sintax php_flag o php_value valores de directivas de PHP que puedas alterar bajo esa modalidad (no todas se pueden configurar así .. pero las que usas Sí).

En tu caso a todas dices "php_value" .. pero eso lo debes usar cuando es un "valor" .. cuando es un "1/0 .. true/false .. un "boleean"" ahí tendrías que decir "php_flag" (teóricamente). Por ahí podría estar tu problema .. (por mi parte no te lo puedo corroborrar, no lo he probado personalmente).

Cita:
¿Afecta mucho que deje el que sí me funcionó con el probability y el divisor en 1, aun si sólo habrán uno o dos usuarios que no entrarían a diario?
Si te soy sincero .. yo nunca ajusto ese valor .. dejo el que PHP me dá por defecto. Pero, es cierto que ese valor vá directamente proporcional a las veces que se inicia una sesión o se accede a ella, es decir .. al porcentaje de veces que se usa "session_start()" en tus scripts de tu aplicación y en general de todos los que ese servidor corra. Si ajustas ese valor demasiado bajo y tienes muchos inicios de sesión .. el proceso de "garbage (basura recolector) se iniciará muchas veces .. sieno no tan necesario y por ende consumiento más recursos del servidor. Justamente para eso se inventó el proceso de "recolección de basura" (garbaje) .. por eso las sesiones al "expirar" no se eliminan al instante sino que son "marcadas" como "esta es para que la borres cuando toque" .. es como "sacar la basura" .. cuando pase el "caminón" a recojerla y llevarsela de la puerta de tu casa eso ya es otra cosa. Pero como veras en este "simil" .. tu puedes saber que pasará la basura 1 vez al día y como no produces mucha .. no se te acomulará mucha en tu puerta .. pero si tu generas más basura te interesará que pase "2 veces" al día en ese caso .. por eso se ajusta ese "porcentaje" y va en función de las veces que creas sesiones.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #7 (permalink)  
Antiguo 30/10/2006, 10:11
Avatar de Escoffie  
Fecha de Ingreso: abril-2003
Ubicación: Mérida, Yucatán
Mensajes: 242
Antigüedad: 21 años
Puntos: 9
Hola Cluster, muy interesante el documento de Session Fixation. Con eso ya me queda claro porqué usar Cookies.

Sobre el tema del php_values y el php_flag, según la documentación de www.php.net/php_values, el php_flag se usa sólo para valores booleanos que se expresan en términos de "on|off". De todos modos probé ambas combinaciones y el resultado fue el mismo.

Para salir de dudas de si era por algún error en el .htaccess, hice lo mismo vía ini_set() y el resultado fue el mismo.

Al decir que no funciona, me refiero a que la sesión no dura lo esperado. Es decir, el SID sí se propaga correctamente.

Gracias por tu explicación sobre el garbage collector. Ya con eso me queda claro el papel del probability y el divisor.

Gracias por la ayuda :)
  #8 (permalink)  
Antiguo 30/10/2006, 16:12
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 4 meses
Puntos: 129
Cita:
Iniciado por Escoffie Ver Mensaje
Hola Cluster, muy interesante el documento de Session Fixation. Con eso ya me queda claro porqué usar Cookies.

Sobre el tema del php_values y el php_flag, según la documentación de www.php.net/php_values, el php_flag se usa sólo para valores booleanos que se expresan en términos de "on|off". De todos modos probé ambas combinaciones y el resultado fue el mismo.

Para salir de dudas de si era por algún error en el .htaccess, hice lo mismo vía ini_set() y el resultado fue el mismo.

Al decir que no funciona, me refiero a que la sesión no dura lo esperado. Es decir, el SID sí se propaga correctamente.

Gracias por tu explicación sobre el garbage collector. Ya con eso me queda claro el papel del probability y el divisor.

Gracias por la ayuda :)
Realmente no sé que problema puedas tener con la alteración de esos valores vía .htaccess .. Te puedo confirmar que como has visto en otros mensajes donde hago las mismas recomendaciones a otras personas les funciona.

También te puedo confirmar que en php.ini directo ese tipo de modificaciones también funcionan.

Como no eres propietario del servidor como para hacer la "prueba final" que sería alterando el php.ini y así corrobarar que la configuración de PHP se vé alterado sus cambios .. no te puedo dar más explicaciones. Sé que mucho proveedor puede bloquear que directivas se pueden alterar en php.ini (no sé como .. pero de hecho lo hacen .. no he investigado como lo definen), así que no me cabe más que recomendarte que contactes a tu proveedor y le expongas el caso y tus necesidades, tal vez te digan "ah! .. estimado cliente .. debe usar un php.ini que debe colocar Ud. personalizado en tal directorio de su sitio" (muchos lo trabajan así .. no con un .htaccess).

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #9 (permalink)  
Antiguo 31/10/2006, 08:31
Avatar de Escoffie  
Fecha de Ingreso: abril-2003
Ubicación: Mérida, Yucatán
Mensajes: 242
Antigüedad: 21 años
Puntos: 9
Gracias Cluster.
Al final opté por hacer un ini_get() del maxtimelige por defecto y con Javascript saco un alert avisándole al usuario que le quedan 2 minutos antes de que se cierre su sesión.
Probaré contactar a mi proveedor a ver qué opciones me ofrece.

Saludos y muchas gracias.
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 02:51.