PHP Sesións

De MediaWiki
Saltar a: navegación, buscar
  • Pódese empregar para pasar información 'importante' ou confidencial.
  • Unha sesión 'dura' mentres un usuario está conectado a un sitio web.
  • Empeza cando se conecta por primeira vez.
  • Remata cando sae do sitio web ou leva un tempo de inactividade indicado pola directiva session.gc_maxlifetime no arquivo php.ini. Por defecto está establecido en 1440 segundos (24 minutos).
  • Dentro da sesión dun usuario é posible crear variables que manterán o seu valor mentres o usuario teña a sesión activa, e poderemos obter ditos valores dende calquera páxina do sitio web.
É importante sinalar que as variables de sesión SE GARDAN NO SERVIDOR a diferenza das cookies que se envían ao cliente e se gardan no seu computador.


  • Cada vez que se inicia unha sesión, se crea un identificador único (ID) o cal pode ser pasado dunha páxina a outra pola URL ou por medio de cookies, se se ten habilitado o uso das mesmas.
  • Por motivos de seguridade se recomenda pasar o ID a través de cookies e non da URL.


  • Se se quere 'obrigar' ao usuario que utilice as cookies para pasar o ID se pode modificar o arquivo php.ini:
session.use_only_cookies = 1
Nota: Se estamos non aloxamento compartido, non teremos acceso ao arquivo php.ini, polo que poderemos crear un arquivo .htaccess no noso sitio web e engadir dita directiva ao mesmo.


É importante lembrar que debemos chamar a dita función sempre que fagamos uso de variables de sesión.
Dita chamada ten que facerse antes de enviar nada ao explorador do cliente (é dicir, facer un echo/printf ou calquera outra función que envíe algunha información ao navegador do cliente).
Normalmente sitúase ao principio da páxina php.
Isto é debido a que o ID da sesión envíase como encabezado HTTP ao utilizar unha cookie.


  • Unha vez chamada podemos crear / utilizar as variables de sesión da forma: $_SESSION['variable'] = "valor";


  • Se queremos borrar os valores gardados nas variables de sesión:
  • Podemos chamar á función unset($_SESSION['var']); dentro dunha páxina coa sesión iniciada.
Por exemplo:
  1. <?php
  2.     session_start();
  3.  
  4.      .......
  5.  
  6.     unset($_SESSION['nome']);
  7. ?>
  • Tamén podemos chamar á función session_unset() coa sesión iniciada, que borra todas as variables de sesión da memoria.
  1. <?php
  2. session_start();
  3. .....
  4. session_unset();
  5. ?>
Por exemplo:
  1. <?php
  2. session_start();
  3. .....
  4. session_destroy();
  5. ?>
Nota: A sesión ten que estar iniciada antes de chamar a session_destroy().
Atención: Esta función elimina os datos de sesión gardados no servidor pero non elimina a cookie (método por defecto) que identifica a sesión e que se garda no computador do cliente conectado. Dita cookie seguirá existindo ata que expire ou o cliente peche o navegador.
Se queremos borrala teremos que executar o seguinte código:
  1. <?php
  2. session_start();
  3.  
  4. .....
  5.  
  6. session_destroy();
  7. setcookie(session_name(),'',0,'/');
  8. ?>


  • Lembrar que $_SESSION é un array e polo tanto podemos percorrelo e borrar todos os elementos:
  1. <?php
  2. foreach(array_keys($_SESSION) as $k) unset($_SESSION[$k])
  3. ?>


Basicamente o que indica é que cando facemos un session_start() estamos cargando os datos gardados no disco do servidor no array global $_SESSION.
Cando facemos un session_unset() estamos a borrar ese array, pero os datos seguen gardados no disco ata que remata de procesar a páxina, momento en que se pasan os datos do array (borrados) a disco, borrando os datos.
Cando facemos un session_destroy() os datos gardados no disco do servidor son borrados, pero a copia local gardada na variable $_SESSION segue existindo na páxina que se está a procesar.


  • A orde correcta para eliminar todas as variables de sesión e que deixen de ser válidas na páxina que se está a procesar, eliminando o id de sesión gardado en forma de cookie no computador do cliente sería:
  1. <?php
  2. session_start();
  3. .....
  4. session_unset();
  5. session_destroy();
  6. setcookie(session_name(),'',0,'/');
  7. ?>


  • Vexamos un exemplo:
  • Arquivo UD4_session_Ex1_paxina1.php:
  1. <?php
  2.     session_start();
  3. ?>
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  5.     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  6.  
  7. <html>
  8.     <head>
  9.         <meta charset="UTF-8">
  10.         <title></title>
  11.     </head>
  12.     <body>
  13. <?php
  14.     $_SESSION['nome']='angel';
  15.  
  16. ?>
  17.         <h1>Posto o valor da variable session 'nome' a Angel.</h1>
  18.         <h2>Pulsa <a href='UD4_session_Ex1_paxina2.php'> para ver o seu valor</a> noutra páxina...</h2>.
  19.        
  20.        
  21.     </body>
  22. </html>

Php session 1.jpg

  • Arquivo UD4_session_Ex1_paxina2.php:
  1. <?php
  2.     session_start();
  3. ?>
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  5.     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  6.  
  7. <html>
  8.     <head>
  9.         <meta charset="UTF-8">
  10.         <title></title>
  11.     </head>
  12.     <body>
  13. <?php
  14.      printf("<h1>O valor da variable sesión é: %s</h1>",$_SESSION['nome']);
  15.      printf("<h2>O valor do ID de sesión é: %s</h2>",  session_id());
  16.  
  17. ?>
  18.      <h2>Pulsa <a href='UD4_session_Ex1_paxina3.php'> para borrar o seu valor</a>...</h2>.
  19.        
  20.     </body>
  21. </html>

Php session 2.jpg


  • Arquivo UD4_session_Ex1_paxina3.php:
  1. <?php
  2.     session_start();
  3.  
  4.  
  5.     session_unset();  // Poderíamos poñer: session_unset['nome']
  6.     session_destroy();
  7.     setcookie(session_name(),'',0,'/');
  8.  
  9.  
  10.     // Lembrar que o session_id segue estando gardado como cookie no cliente.
  11.     // Se queredes borrala teredes que poñer: setcookie(session_name(),'',0,'/');
  12.  
  13. ?>
  14. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  15.     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  16.  
  17. <html>
  18.     <head>
  19.         <meta charset="UTF-8">
  20.         <title></title>
  21.     </head>
  22.     <body>
  23. <?php
  24.     printf("<h1>O valor da variable sesión é: %s</h1>",$_SESSION['nome']);
  25.     printf("<h2>O valor do ID de sesión é: %s</h2>",  session_id());
  26.  
  27. ?>
  28.      <h2>Pulsa <a href='UD4_session_Ex1_paxina1.php'> para volver a darlle un valor</a>...</h2>.
  29.        
  30.     </body>
  31. </html>

Php session 3.jpg



  • Podemos comprobar como dende o servidor se envía unha cookie ao cliente para que se garde o identificador de sesión e así o servidor é capaz de identificar ao cliente.


  • Por iso é importante que cando un usuario decida saír dun programa no que estea autenticado, debe premer a opción saír, xa que un usuario podería obter o id da sesión gardada localmente, modificar a súa id cun plugin calquera e acceder á información de sesión gardada no servidor.
  • O uso da URL para pasar o identificador de sesión (se non temos habilitado o uso de cookies) non é recomendable, xa que é visualmente accesible para calquera e se queremos compartir unha URL estariamos compartindo tamén o noso identificador de sesión.
  • Tamén se recomenda limitar o tempo de vida dunha cookie. Este parámetro se pode configurar coa directiva session.cookie_lifetime tempo_en_segundos no que indicamos o tempo en segundos que vai ter validez a cookie enviada ao navegador. O valor por defecto é de 0, que significa que a cookie será válida ata que se pecha o navegador.




-- Ángel D. Fernández González -- (2017).