Diferencia entre revisiones de «PHP Sesións»

De MediaWiki
Ir a la navegación Ir a la búsqueda
Línea 34: Línea 34:
  
 
::: Por exemplo:
 
::: Por exemplo:
−
:::<syntaxhighlight lang="php" line enclose="div" highlight="" >
+
:::<syntaxhighlight lang="php" line enclose="div" highlight="6" >
 
<?php
 
<?php
 +
    session_start();
 +
 +
    .......
 +
 
     unset($_SESSION['nome']);
 
     unset($_SESSION['nome']);
−
    unset($_SESSION['id']);
 
 
?>
 
?>
 
</syntaxhighlight>  
 
</syntaxhighlight>  
 +
:::* Tamén podemos chamar á [http://php.net/manual/es/function.session-unset.php función session_unset()] coa sesión iniciada, que borra todas as variables de sesión da memoria.
 +
::::<syntaxhighlight lang="php" line enclose="div" highlight="" >
 +
<?php
 +
session_start();
 +
.....
 +
session_unset();
 +
?>
 +
</syntaxhighlight>
 +
 
::* Podemos chamar á [http://php.net/manual/es/function.session-destroy.php función session_destroy()].
 
::* Podemos chamar á [http://php.net/manual/es/function.session-destroy.php función session_destroy()].
 
::: Por exemplo:
 
::: Por exemplo:
Línea 53: Línea 65:
 
: '''<u>Atención:</u>''' 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.
 
: '''<u>Atención:</u>''' 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:
 
: Se queremos borrala teremos que executar o seguinte código:
−
:::<syntaxhighlight lang="php" line enclose="div" highlight="5" >
+
:::<syntaxhighlight lang="php" line enclose="div" highlight="7" >
 
<?php
 
<?php
 
session_start();
 
session_start();
 +
 
.....
 
.....
 +
 
session_destroy();
 
session_destroy();
 
setcookie(session_name(),'',0,'/');
 
setcookie(session_name(),'',0,'/');
Línea 71: Línea 85:
  
  
−
::* Tamén podemos chamar á [http://php.net/manual/es/function.session-unset.php función session_unset()] coa sesión iniciada, que borra todas as variables de sesión da memoria.
 
−
:::<syntaxhighlight lang="php" line enclose="div" highlight="" >
 
−
<?php
 
−
session_start();
 
−
.....
 
−
session_unset();
 
−
?>
 
−
</syntaxhighlight>
 
  
 
* Para ver a diferenza entre session_destroy() e session_unset() recomendo ver [https://rg1024.wordpress.com/2016/02/18/session_unset-vs-session_destroy/ esta entrada dun blog].
 
* Para ver a diferenza entre session_destroy() e session_unset() recomendo ver [https://rg1024.wordpress.com/2016/02/18/session_unset-vs-session_destroy/ esta entrada dun blog].
Línea 84: Línea 90:
 
: 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_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.
 
: 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:
+
 
 +
 
 +
* 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:
 
:::<syntaxhighlight lang="php" line enclose="div" highlight="" >
 
:::<syntaxhighlight lang="php" line enclose="div" highlight="" >
 
<?php
 
<?php
Línea 91: Línea 99:
 
session_unset();
 
session_unset();
 
session_destroy();
 
session_destroy();
 +
setcookie(session_name(),'',0,'/');
 
?>
 
?>
 
</syntaxhighlight>  
 
</syntaxhighlight>  
 +
  
 
* Vexamos un exemplo:
 
* Vexamos un exemplo:
Línea 156: Línea 166:
 
<?php
 
<?php
 
     session_start();
 
     session_start();
−
     unset($_SESSION['nome']);
+
 
−
     unset($_SESSION['id']);
+
 
−
     // 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.
+
     session_unset();  // Poderíamos poñer: session_unset['nome']
 +
     session_destroy();
 +
     setcookie(session_name(),'',0,'/');
  
  

Revisión del 11:02 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     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 -- (2016).