PHP - Como cierro todas las Sesiones en PHP??

 
Vista:
Imágen de perfil de Kathyu
Val: 1.802
Plata
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Como cierro todas las Sesiones en PHP??

Publicado por Kathyu (905 intervenciones) el 26/04/2019 01:07:48
Hola, leyendo por ahí me tope con algo que no se como resolver, a ver si me dan una luz.

Problema: Usuarios descuidados que inician sesión donde sea. Y no cierran la sesión.
Solución 1: Cerrar por medio de una opción que solo los SA manejemos todas las sesiones de los usuarios, no importa quien ni donde, que se cierren todas las sesiones de php.

Datos:
Encontré esto para el php.ini
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
; Defines the probability that the 'garbage collection' process is started
; on every session initialization. The probability is calculated by using
; gc_probability/gc_divisor. Where session.gc_probability is the numerator
; and gc_divisor is the denominator in the equation. Setting this value to 1
; when the session.gc_divisor value is 100 will give you approximately a 1% chance
; the gc will run on any give request.
; Default Value: 1
; Development Value: 1
; Production Value: 1
; http://php.net/session.gc-probability
session.gc_probability = 1
 
; Defines the probability that the 'garbage collection' process is started on every
; session initialization. The probability is calculated by using the following equation:
; gc_probability/gc_divisor. Where session.gc_probability is the numerator and
; session.gc_divisor is the denominator in the equation. Setting this value to 1
; when the session.gc_divisor value is 100 will give you approximately a 1% chance
; the gc will run on any give request. Increasing this value to 1000 will give you
; a 0.1% chance the gc will run on any give request. For high volume production servers,
; this is a more efficient approach.
; Default Value: 100
; Development Value: 1000
; Production Value: 1000
; http://php.net/session.gc-divisor
session.gc_divisor = 1000

Pero yo no lo quiero por configuración, lo que quiero es una opción, donde al dar click sea como cuando yo hago logout, que destruyo la sesión mía, pero que en este proceso destruya todas las conexiones o sesiones del sistema, de todo el mundo.

Y esto que creo que es por medio de "código"
1
2
3
4
5
Me parece q lo q estás pidiendo es una forma de borrar todas las sesiones de todos los usuarios.
Con session_destroy() solo borras la sesión del usuario q ha llamado a esa función.
 
Para borrar todas las sesiones necesitas saber donde tu instalación de php guarda estas sesiones, esa información te la dá la función session_save_path().
Luego solo tienes q borrar todos los ficheros q se encuentren en ese directorio.

Y esto que es por medio de tiempo y creación de variables de sesión, pero para este ejemplo tengo las siguientes dudas:
1- Se aplica solo en el login o debo hacer este proceso en cada archivo php?
2- Este proceso cerraría las sesiones de otras maquinas o solo las sesiones de la maquina actual?

Se podrá?

Solución 2: Hacer un proceso donde, o no lo deje entrar si hay una sesión abierta o que cierre la sesión abierta que tenga en otra PC.

Pero esto me llevaría al hecho de que un usuario no podría tener dos sesiones abiertas, cosa que sabemos que no es muy factible pues si yo me logeo en LWP en mi oficina de igual forma lo puedo hacer en casa o en mi celular y LWP no me restringe el acceso, igual gmail, FB entre otros. Pero no así los bancos, que no importa donde o como, si hay sesión iniciada no permite otra sesión, en una PC diferente.

Alguna idea?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
1
Responder
Imágen de perfil de Mauro
Val: 2.761
Oro
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

Como cierro todas las Sesiones en PHP??

Publicado por Mauro (1034 intervenciones) el 26/04/2019 15:29:37
Muy interesante tu pregunta! Para empezar diría que el escenario 2 (No dejar a un usuario logearse mientras tenga una sesión activa) es bastante simple de lograr. Basta con que tengas un campo en tu base de datos tipo last_active que guarde el timestamp de la última actividad del usuario y luego, al volver a intentar un login, además de verificar username y password, puedes validar cuánto tiempo ha pasado desde la úlima actividad registrada y, si el tiempo es menor a un valor que definas (esto dependerá de cómo los usuarios suelen interactuar con tu sitio) puedes asumir que hay otra sesión abierta.

Lo que deberías hacer para que todo esto funcione es mantener este valor correctamente actualizado (Podrías utilizar un mecanismo similar al que se describe aquí) y ponerlo en null cuando el usuario cierra sesión.

Por el otro lado, si lo que quieres es que un administrador pueda deslogear a un usuario en el momento que quiera, el tema se vuelve algo más complejo...

Investigando un poco llegué a esta solución que parece interesante y a esta otra que podría andar también (Aunque la veo algo más difícil de implementar).

Y leyendo todavía un poquito más llegué a esta solución que me parece realmente la más elegante y sencilla.

Todo lo que tienes que hacer es almacenar el id de sesión en el registro del usuario cada vez que inicia sesión y blanquearlo cuando la cierra.

De este modo puedes implementar un script que cierre la sesión de cualquier usuario (Claro que tienes que tenerlo bien protegido!).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Kathyu
Val: 1.802
Plata
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Como cierro todas las Sesiones en PHP??

Publicado por Kathyu (905 intervenciones) el 26/04/2019 17:51:47
Definitivamente muy buenas soluciones, la última creo que es la mejor, hay que trabajarla eso sí.

Por ahí vi unas cositas que me llaman la atención:

1- A pesar que en mi php.ini tanto en desarrollo (XAMPP) como en producción (Módulos Separados) tengo esto: session.use_strict_mode=0 que se supone que destruye la sesión si el navegador se reinicia. PORQUE NO LO HACE?

2- Que también existe esta directiva: session.gc_maxlifetime=1440 que dice que la sesión se destruya pasados los 24 minutos sin que el usuario haga actividad (con el navegador abierto) entre cliente y el servidor. PORQUE TAMPOCO LO HACE?

3- Que hay un lugar donde se guardan las sesiones, por ejemplo: session.save_path="C:\xampp\SessionTMP" y que si borro todo lo de esa carpeta (seleccionar y delete), entonces sí, todo el mundo sale del sistema (si es rudo pero si funciona).
3.1- Entonces que pasa si yo quiero hacer un proceso de borrado de esos archivos tomando en cuenta que están "fuera" del web root??
3.2- Sera que puedo ingresar a una ruta física del disco y eliminar lo que halla ahí con php?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Mauro
Val: 2.761
Oro
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

Como cierro todas las Sesiones en PHP??

Publicado por Mauro (1034 intervenciones) el 27/04/2019 16:42:32
1. ¿Por qué piensas que session.use_strict_mode=0 destruiría las sesiones cuando el navegador se cierra? Según mi entendimiento (Alguna referencia acá) lo que hace este setting es determinar si el servidor aceptará o no ids de sesión que no hayan sido creados por él (No lo había visto antes pero me parece súper importante tenerlo activado!).

2. ¿Cómo sabes que tampoco lo hace?

3.1. El hecho de que los archivos estén fuera del webroot no debería ser un problema. Basta con que el usuario que ejecute el proceso tenga permisos suficientes sobre los directorios/archivos afectados. Mi recomendación aquí sería usar un cronjob o similar (No estoy muy familiarizado con Windows).
3.2 Claro! Un ejemplo acá.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kathyu
Val: 1.802
Plata
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Como cierro todas las Sesiones en PHP??

Publicado por Kathyu (905 intervenciones) el 29/04/2019 17:06:46
1- Creo que me equivoque, era esto que dice el php.ini y esta habilitada y no lo hace.
1
2
3
; Lifetime in seconds of cookie or, if 0, until browser is restarted.
; http://php.net/session.cookie-lifetime
session.cookie_lifetime=0

2- Mi sesión no se cierra y no hago nada en ella. Yo lo probé

3- Ok buscare mas de ello
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Mauro
Val: 2.761
Oro
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

Como cierro todas las Sesiones en PHP??

Publicado por Mauro (1034 intervenciones) el 29/04/2019 21:23:07
Respecto del punto 1 habría que ver bien cómo se graba la cookie de sesión... y verificar que efectivamente no quede ahí cuando cierras el navegador y lo vuelves a abrir... puedes usar la consola de FireFox o las herramientas de developer de Chrome para ver eso.

Otro detalle importante que dice la documentación es:

"Nota: La marca de tiempo de caducidad se establece relativa a la hora del servidor, la cúal no es necesariamente la misma que la hora del navegador del cliente."

Dudo que este sea el problema, pero da como para sospechar :)

Sobre el punto 2 hay que ver qué se considera "actividad". Si hay algún ajax por ejemplo, la actividad es constante (De hecho, así resolví yo un problema de logout automático)... aunque tú explícitamente no hagas nada. Supongo que eso también lo puedes ver monitoreando de cerca la fecha de expiración de la cookie de sesión
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kathyu
Val: 1.802
Plata
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Como cierro todas las Sesiones en PHP??

Publicado por Kathyu (905 intervenciones) el 29/04/2019 21:47:12
Puede que eso sea, un Ajax.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Alejandro
Val: 1.634
Plata
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Como cierro todas las Sesiones en PHP??

Publicado por Alejandro (838 intervenciones) el 29/04/2019 22:18:56
  • Alejandro se encuentra ahora conectado en el
  • chat de PHP
No se si te sea de utilidad, las sesiones se guardan en archivos sess_CadenaVariable y si eliminas el archivo la sesión muere.
La ubicación de los archivos en mi IIS es C:\Windows\Temp pero la obtienes con:
1
ini_get("session.save_path")
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kathyu
Val: 1.802
Plata
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Como cierro todas las Sesiones en PHP??

Publicado por Kathyu (905 intervenciones) el 29/04/2019 23:02:51
Claro, en base a eso es que quería ver si podía yo como SA entrar a un directorio del server c:\sess_tmp y eliminar todo lo que ahí hay, haciendo eso cierro todo, hasta mi sesión.

Y mauro me decía que si, que se puede hacer.


Si nos concentramos en su respuesta, habría que ir guardando el sess_id de cada logueo del cliente y en una vista traer todas esas sess_id's e ir cerrando una a una según nos convenga, por cliente o IP.

Por el momento lo que tengo es que al archivo ese le puse la IP y el nombre de la PC desde donde se inició sesión, lo abro veo que no es la PC asignada al usuario y fácilmente la puede eliminar. (ahorita lo tengo manual) solo seria automatizarlo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar