Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: gAb1 en 10 Junio 2015, 01:26 am



Título: variables de sesión no funcionan despues de destruir la sesión
Publicado por: gAb1 en 10 Junio 2015, 01:26 am
Hola buenas, necesito crear variables de sesión despues de que la sesión haya sea destruida (por inactividad), para imprimir un mensaje y para saber a que url redireccionar.

La página platform requiere que estes logueado para mostrarse, si no es el caso redirecciona automaticamente a login y al loguear detecta que session url esta declarada entonces en lugar de redireccionar a la web por defecto (la principal) redirecciona a la página platform.

Mi funcion session_start destruye la sesion cuando pasan 5 minutos sin actividad:

Código
  1. $hasExpired = NULL;
  2.  
  3. if (isset($_SESSION['client_id'], $_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY']) > 300) {
  4. // last request was more than 5 minutes ago
  5. $_SESSION = array();                    // unset $_SESSION variable for the run-time
  6. $params = session_get_cookie_params();  // Get session parameters
  7. setcookie(session_name(),               // Delete the actual cookie
  8.  '',
  9.  time() - 3600,
  10.  $params["path"],
  11.  $params["domain"],
  12.  $params["secure"],
  13.  $params["httponly"]);
  14. session_destroy();                      // destroy session data in storage
  15.  
  16. $hasExpired = true;                     // now we know the user has lost his session for inactivity
  17. }

Para avisar al usuario de que su sesión ha expirado y por esa razón se le ha redireccionado a la pagina login:

Código
  1. $hasExpired = $web_user::sec_session_start();
  2.  
  3. if ($hasExpired == true) {
  4. $_SESSION['msg'] = 'msg_afk';  // no funciona
  5. $_SESSION['url'] = 'platform';  // no funciona
  6. die(header('Location: ' . $path_login));
  7. }

En la página login se deberia mostrar el mensaje, pero no aparece ninguno porque la variable esta vacia... y tampoco redirecciona a la misma pagina de la que se le cerró la sesión.

Más abajo, en index.php, tengo otro header y ahí si que funciona la variable de sesión:

Código
  1. // if logged in == true
  2. else {
  3.    $_SESSION['url'] = 'platform'; // working
  4.    die(header('Location: ' . $path_login));
  5. } // if I log in again I'm redirected to platform

¿Alguna idea de por qué no funcionan las variables de sesión despues de destruirse la sesión?

Ya he probado a empezarla de nuevo antes de declarar las variables, pero nada...

Gracias!


Título: Re: variables de sesión no funcionan despues de destruir la sesión
Publicado por: MinusFour en 10 Junio 2015, 03:10 am
No estoy muy seguro. Yo creo que después que destruyes la sesión, no puedes volver a guardar los datos en la sesión porque no hay ninguna activa, a menos que inicies una nueva sesión con session_start. Incluso el manual de PHP lo dice:

Citar
To use the session variables again, session_start() has to be called.


Título: Re: variables de sesión no funcionan despues de destruir la sesión
Publicado por: gAb1 en 10 Junio 2015, 03:37 am
Pues que cosa más extraña porque ya lo intenté, y de dos maneras:

Código
  1. if ($hasExpired == true) {
  2.        $web_user::sec_session_start();
  3. $_SESSION['msg'] = 'msg_afk';  // no funciona
  4. $_SESSION['url'] = 'platform';  // no funciona
  5. die(header('Location: ' . $path_login));
  6. }

Y así:

Código
  1. if ($hasExpired == true) {
  2.        session_start();
  3. $_SESSION['msg'] = 'msg_afk';  // no funciona
  4. $_SESSION['url'] = 'platform';  // no funciona
  5. die(header('Location: ' . $path_login));
  6. }

Pero voy a probar otra vez, a veces pasan cosas raras...  :rolleyes:


Título: Re: variables de sesión no funcionan despues de destruir la sesión
Publicado por: MinusFour en 10 Junio 2015, 04:48 am
Yo creo que la sesión se esta perdiendo en algún lado, yo revisaría que la cookie exista.


Título: Re: variables de sesión no funcionan despues de destruir la sesión
Publicado por: gAb1 en 10 Junio 2015, 15:12 pm
Alomejor sabiendo como funciona todo te haces una idea:

Tengo un framework al que se conectan varias páginas (principal y subdominios). Todas las páginas (en index.php) empiezan la sesión de la misma manera:

Código
  1. $hasExpired = $web_user::sec_session_start();

Para que funcione la sesión en todos los subdominios, simplemente añado un punto delante del dominio, como dice en la documentación php.net:

Código
  1. $domain = '.domain.com';

Es extraño que no funcione, ya que he probado otra vez empezando la sesión, de las dos maneras esas...

¿Tal vez en los logs de php se puede ver que está pasando? Tendré que pedir acceso SSH...

Si esto no funciona, voy a tener que contemplar otra manera de saber si el usuario ha perdido la sesión por inactividad... aunque primero habrá que ver otra manera de pasar las variables a la página login (que no sea por get).


Título: Re: variables de sesión no funcionan despues de destruir la sesión
Publicado por: MinusFour en 10 Junio 2015, 16:16 pm
Es parte de un antiguo standard, los nuevos navegadores simplemente descartan el punto. Prueba a expirar la session normal y tu location ponlo así:

Código
  1. die(header('Location: ' . $path_login . '?' . htmlspecialchars(SID)));


Título: Re: variables de sesión no funcionan despues de destruir la sesión
Publicado por: gAb1 en 10 Junio 2015, 18:28 pm
Nada, tampoco funcionan asi. Puse un print $_SESSION['msg'] . $_SESSION['url']; en la pagina login pero da undefined index...

De todas maneras, y pensadolo mejor, creo que será mejor poner una página entera para mostrar el mensaje de afk y explicar el motivo de la desconexión que redirigir y mostrar un simple jquery notify.

Pero seria interesante descubir el por que... hehehe

Voy a probar con la versión más reciente de PHP, ahora mismo estoy usando la 5.4.41


Título: Re: variables de sesión no funcionan despues de destruir la sesión
Publicado por: MinusFour en 10 Junio 2015, 19:08 pm
Nada, tampoco funcionan asi. Puse un print $_SESSION['msg'] . $_SESSION['url']; en la pagina login pero da undefined index...

De todas maneras, y pensadolo mejor, creo que será mejor poner una página entera para mostrar el mensaje de afk y explicar el motivo de la desconexión que redirigir y mostrar un simple jquery notify.

Pero seria interesante descubir el por que... hehehe

Voy a probar con la versión más reciente de PHP, ahora mismo estoy usando la 5.4.41

¿La pagina a la que te redirecciona te esta dando una id (la URL)?


Título: Re: variables de sesión no funcionan despues de destruir la sesión
Publicado por: gAb1 en 10 Junio 2015, 19:30 pm
No, solo sale ?, pero nada más. La sesión empezada otra vez, como en los dos ejemplos de arriba.

Así:

Código
  1.    if ($hasExpired == true) {
  2.            /*$web_user::sec_*/session_start();  // de las dos maneras
  3.     $_SESSION['msg'] = 'msg_afk';  // no funciona
  4.     $_SESSION['url'] = 'platform';  // no funciona
  5.        die(header('Location: ' . $path_login . '?' . htmlspecialchars(SID)));
  6.    }


Título: Re: variables de sesión no funcionan despues de destruir la sesión
Publicado por: MinusFour en 10 Junio 2015, 19:44 pm
Pues eso es un indicador que no hay una sesión activa y probablemente tu session_start no llega a iniciar la sesión. ¿No hay ningún error arrojado? ¿Tienes display_errors activado y error_reporting en E_ALL?


Título: Re: variables de sesión no funcionan despues de destruir la sesión
Publicado por: gAb1 en 10 Junio 2015, 21:05 pm
Pues no estoy seguro, al principio de cada index.php siempre pongo ini_set('display_errors', '1'); eso es imprescindible al desarrollar. Pero lo otro no estoy seguro, mirando en phpinfo() veo lo siguiente: error_reporting   22527

Ahora mismo pongo ini_set('error_reporting', E_ALL); tambien.

Edito: sigue sin salir ningún error, aparte del undefined index.