Ir al contenido



Foto

HTTPs no pasa mi $_SESSION


  • Por favor identifícate para responder
11 respuestas en este tema

#1 Richi

Richi

    Advanced Member

  • Miembros
  • PipPipPip
  • 81 mensajes

Escrito 27 junio 2018 - 11:11

Hola, tengo una web que a modo local y antes de subirla a un nuevo servidor funcionaba todo bien, la subi al nuevo servidor, hicieron https y ahora tengo un index, un validar que crea las session de elementos y una vez creados me redirige a una página para ser usada con sessions.

 

Lo que pasa es que en el validar si muestra la session y todo bien pero cuando pasan a la otra página como que se pierde o se muere la session, me parece que es por el https y que no acepta las redirecciones de ese tipo o seguramente es otra cosa, si alguno tiene idea o le ha pasado porfavor contarme como solucionaron

 

Saludos.


  • 0

#2 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.385 mensajes
  • LocationRepública Dominicana

Escrito 27 junio 2018 - 04:42

Las sesiones bajo HTTPS difieren a las que se envían bajo HTTP, por ello tienes dos soluciones:

 

1) Añadir la directiva session.cookie_secure:


php
  1. if (env('HTTPS')) {
  2. ini_set('session.cookie_secure', 1);
  3. }

2) Hacer uso de sólo cookies, el siguente código habilita los cookies en ambos casos


php
  1. >?php
  2.  
  3. $secure = array_key_exists('HTTPS', $_SERVER);
  4. $cookie = false;
  5.  
  6. // Actual sesión
  7. if(array_key_exists('PHPSESSID', $_COOKIE))
  8. {
  9. $cookie = setcookie('PHPSESSID', $_COOKIE['PHPSESSID'], NULL, NULL, NULL, (int) !$secure);
  10. }
  11.  
  12.  
  13. // nueva sesión
  14. if(!$cookie)
  15. {
  16. setcookie(session_name(), session_id(), NULL, NULL, NULL, (int) !$secure);
  17. }
  18. ?>;

Saludos.


  • 0

#3 Richi

Richi

    Advanced Member

  • Miembros
  • PipPipPip
  • 81 mensajes

Escrito 27 junio 2018 - 05:28

Las sesiones bajo HTTPS difieren a las que se envían bajo HTTP, por ello tienes dos soluciones:

 

1) Añadir la directiva session.cookie_secure:


php
  1. if (env('HTTPS')) {
  2. ini_set('session.cookie_secure', 1);
  3. }

2) Hacer uso de sólo cookies, el siguente código habilita los cookies en ambos casos


php
  1. >?php
  2.  
  3. $secure = array_key_exists('HTTPS', $_SERVER);
  4. $cookie = false;
  5.  
  6. // Actual sesión
  7. if(array_key_exists('PHPSESSID', $_COOKIE))
  8. {
  9. $cookie = setcookie('PHPSESSID', $_COOKIE['PHPSESSID'], NULL, NULL, NULL, (int) !$secure);
  10. }
  11.  
  12.  
  13. // nueva sesión
  14. if(!$cookie)
  15. {
  16. setcookie(session_name(), session_id(), NULL, NULL, NULL, (int) !$secure);
  17. }
  18. ?>;

Saludos.

Ok entonces si hago la primera opcion, a donde tengo que poner ese codigo, donde creo las sesiones o en la segunda página donde no se caen? y para que funciona el env('HTTPS')?


  • 0

#4 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.385 mensajes
  • LocationRepública Dominicana

Escrito 27 junio 2018 - 06:04

Lo colocas donde creas la sesión global, me imagino donde se encuentra session_start, no sé si es en tu caso, lo otro verifica si el entorno es bajo https o no.


  • 0

#5 Richi

Richi

    Advanced Member

  • Miembros
  • PipPipPip
  • 81 mensajes

Escrito 28 junio 2018 - 08:43

Lo colocas donde creas la sesión global, me imagino donde se encuentra session_start, no sé si es en tu caso, lo otro verifica si el entorno es bajo https o no.

ok voy a hacer un ejemplo sencillo para darme una mejor idea

 

Aca el index donde meten los datos


html5
  1. <!DOCTYPE html>
  2. </head>
  3. <form action="sesionar.php" method="POST">
  4. <input type="text" name="nombre" required>
  5. <input type="text" name="edad" required>
  6. <input type="text" name="comida" required>
  7. <button class="btn-primary" type="submit" name="action">
  8.  
  9. </form>
  10.  
  11. </body>
  12. </html>


php
  1. sesionar.php
  2.  
  3. $query2 = mysql_query("SELECT nombre,comida,edad from estudiantes where nombre='".$_POST['nombre']."'");
  4. $row2 = mysql_fetch_array($query2);
  5.  
  6. $_SESSION["nombre"] = $row['nombre'];
  7. $_SESSION["edad"] = $row['edad'];
  8. $_SESSION["comida"] = $row['comida'];
  9. echo '<script> window.location="vista/index.php"; </script>';

si en el sesionar.php hago echo de cualquier session si me funciona y si me muestra. entonces si todo eso se cumple deberia entrar al vista/index.php


php
  1. <?php session_start(); ?>
  2. <!DOCTYPE html>
  3. <html>
  4. <head>
  5. <title></title>
  6. </head>
  7. <body>
  8.  
  9.  
  10. <?php echo $_SESSION['nombre']; ?>
  11. <?php echo $_SESSION['comida']; ?>
  12. <?php echo $_SESSION['edad']; ?>
  13. </body>
  14. </html>

entoncces eso que me dices ese codigo de


php
  1. if (env('HTTPS')) {
  2. ini_set('session.cookie_secure', 1);
  3. }

 deberia estar en la de sesionar.php?


  • 0

#6 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.385 mensajes
  • LocationRepública Dominicana

Escrito 28 junio 2018 - 08:53

Sí, puede ser, pero debe estar al inicio de cualquier uso de $_SESSION.


  • 0

#7 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.156 mensajes
  • LocationArgentina

Escrito 28 junio 2018 - 04:18

Yo no estoy muy al tanto del uso de sesiones y/o cookies, pero hasta donde tengo entendido, para hacer uso de $_SESSION en nuestros scripts se necesita antes que nada (quizá al comienzo del script) invocar a session_start() para que se inicialice la sesión o bien para que la reinicialice si ha sido cerrada.

De modo que en cualquier script que pretenda usar sesiones si o si debe tener ese session_start(). No creo que por arte de magia se pueda leer una sesión... sobre todo si ha sido finalizada.

Corrijanme si me equivoco.

 

La función env() no la conozco. Y en la documentación de PHP no aparece. Si en cambio leo un $_ENV pero creo que es otra cosa. ¿Alguien me podría aclarar esto?

 

Sobre HTPPS si es un mundo desconocido para mi.

 

Saludos,


  • 0

#8 Richi

Richi

    Advanced Member

  • Miembros
  • PipPipPip
  • 81 mensajes

Escrito 29 junio 2018 - 12:11

Sí, puede ser, pero debe estar al inicio de cualquier uso de $_SESSION.

ok, de esa manera no me ha funcionado, habia visto un post en otro sitio donde me muestra algo muy parecido pero igual no me ha funcionado del todo. Ahora si puedo decir que en modo local y http el tema de session funciona correctamente, cuando se hizo el cambio a https se generan esos problemas.

 

Como digo la clase de index.php donde lleno los datos al hacer submit me envia a un tiop de validar.php ahi creo la session y todo va excelente, justo al terminar de crear las session y hacer la redireccion por medio de 


php
  1. echo '<script> window.location="ruta/index.php"; </script>';

ese ultimo index tiene su session_start(); y todo pero pierde totalmente la session.

 

Podrá ser tambien la forma de envio?


  • 0

#9 Richi

Richi

    Advanced Member

  • Miembros
  • PipPipPip
  • 81 mensajes

Escrito 29 junio 2018 - 12:13

Yo no estoy muy al tanto del uso de sesiones y/o cookies, pero hasta donde tengo entendido, para hacer uso de $_SESSION en nuestros scripts se necesita antes que nada (quizá al comienzo del script) invocar a session_start() para que se inicialice la sesión o bien para que la reinicialice si ha sido cerrada.

De modo que en cualquier script que pretenda usar sesiones si o si debe tener ese session_start(). No creo que por arte de magia se pueda leer una sesión... sobre todo si ha sido finalizada.

Corrijanme si me equivoco.

 

La función env() no la conozco. Y en la documentación de PHP no aparece. Si en cambio leo un $_ENV pero creo que es otra cosa. ¿Alguien me podría aclarar esto?

 

Sobre HTPPS si es un mundo desconocido para mi.

 

Saludos,

Hola, si  yo estaba liado con eso tambien del env pero encontré que lo que se quiere con eso es encontrar el sobre que se esta trabajando HTTP,HTTPS. despues de ahi encontre otros resultados que no me parecen muy claros.

 

En esa parte que dices de session_start(); es totalmente correcto.

 

Al igual que usted, este tema esta siendo un mundo totalmente diferente porque pense que se manejaban exactamente igual

 

saludos


  • 0

#10 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.385 mensajes
  • LocationRepública Dominicana

Escrito 02 julio 2018 - 01:56

Por lo que veo, estás programando de manera procedural, o sea, no es POO, en el primer caso deberás llamar session_start() y el env en cada archivo donde se haga uso de Sesiones, en el segundo caso sólo se le llama una sóla vez en un archivo Index, pues todas las llamadas pasan por ahí (Debería).

 

Tip: session_start() y el env deben estar en la primera línea de cada archivo, o sea, primero que todos (include, require, etc..)

 

Saludos.


  • 0

#11 Richi

Richi

    Advanced Member

  • Miembros
  • PipPipPip
  • 81 mensajes

Escrito 10 julio 2018 - 09:31

Ok muchachos, para finalizar el tema lo logré. Resulta que cuando se trabaja con AWS hay un tema que si la web se cae el hace un reenvio a otro lugar del mundo donde tiene la pagina y por ende la session se cae. Lo que hay que hacer es trabajarlo igual como http pero si hace un load balancer verificar que no se pierda desde la configuración del AWS

 

Saludos campeones.


  • 0

#12 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.385 mensajes
  • LocationRepública Dominicana

Escrito 11 julio 2018 - 01:33

Ah qué bien, Si hubieses dicho AWS desde el principio le apuntaba por ahí, ya he tenido experiencia con esos servicios y te digo que es una ñoñería..


  • 0