Diferencia entre revisiones de «PHP Sesións»

De MediaWiki
Ir a la navegación Ir a la búsqueda
Línea 92: Línea 92:
 
session_destroy();
 
session_destroy();
 
?>
 
?>
−
 
+
</syntaxhighlight>
  
 
* Vexamos un exemplo:
 
* Vexamos un exemplo:

Revisión del 10:40 2 mar 2017

  • 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     unset($_SESSION['nome']);
3     unset($_SESSION['id']);
4 ?>
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 session_destroy();
5 setcookie(session_name(),'',0,'/');
6 ?>


  • 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 ?>


  • 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 ?>
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 sería:
1 <?php
2 session_start();
3 .....
4 session_unset();
5 session_destroy();
6 ?>
  • 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     unset($_SESSION['nome']);
 4     unset($_SESSION['id']);
 5     // session_destroy();   // Tamén se poden eliminar as variables de sesión desta forma, pero se non facemos as liñas anteriores, dentro do código desta páxina $_SESSION['nome'] seguiría tendo un valor.
 6 
 7 
 8     // Lembrar que o session_id segue estando gardado como cookie no cliente.
 9     // Se queredes borrala teredes que poñer: setcookie(session_name(),'',0,'/');
10 
11 ?>
12 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
13     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
14 
15 <html>
16     <head>
17         <meta charset="UTF-8">
18         <title></title>
19     </head>
20     <body>
21 <?php
22     printf("<h1>O valor da variable sesión é: %s</h1>",$_SESSION['nome']);
23     printf("<h2>O valor do ID de sesión é: %s</h2>",  session_id());
24 
25 ?>
26      <h2>Pulsa <a href='UD4_session_Ex1_paxina1.php'> para volver a darlle un valor</a>...</h2>.
27         
28     </body>
29 </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 -- (2016).