PHP Sesións
Revisión del 17:28 4 mar 2017 de Wiki (discusión | contribuciones)
- 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.
- Para iniciar ou reanudar unha sesión necesitamos chamar á función session_start().
- É 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 ?>
- Podemos chamar á función session_destroy().
- 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 ?>
- Para ver a diferenza entre session_destroy() e session_unset() recomendo ver esta entrada dun blog.
- 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>
- 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>
- 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>
- 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.
Captura do plugin http-header na páxina UD4_session_Ex1_paxina2.php.
- 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).