Diferencia entre revisiones de «PHP Sesións»

De MediaWiki
Ir a la navegación Ir a la búsqueda
Línea 35: Línea 35:
 
?>
 
?>
 
</syntaxhighlight>  
 
</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:
 
:::<syntaxhighlight lang="php" line enclose="div" highlight="" >
 
:::<syntaxhighlight lang="php" line enclose="div" highlight="" >
Línea 45: Línea 45:
 
</syntaxhighlight>  
 
</syntaxhighlight>  
 
: <u>Nota:</u> A sesión ten que estar iniciada antes de chamar a session_destroy().
 
: <u>Nota:</u> A sesión ten que estar iniciada antes de chamar a session_destroy().
 +
 +
: '''<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:
 +
:::<syntaxhighlight lang="php" line enclose="div" highlight="5" >
 +
<?php
 +
session_start();
 +
.....
 +
session_destroy();
 +
setcookie(session_name(),'',0,'/');
 +
?>
 +
</syntaxhighlight>
  
  
Línea 55: Línea 66:
  
  
 +
::* 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();
 +
?>
 +
 +
* 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].
 +
: 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:
 +
:::<syntaxhighlight lang="php" line enclose="div" highlight="" >
 +
<?php
 +
session_start();
 +
.....
 +
session_unset();
 +
session_destroy();
 +
?>
  
  
Línea 120: Línea 151:
 
     unset($_SESSION['nome']);
 
     unset($_SESSION['nome']);
 
     unset($_SESSION['id']);
 
     unset($_SESSION['id']);
 +
    // session_start();
 
     // session_destroy();  // Tamén se poden eliminar as variables de sesión desta forma.
 
     // session_destroy();  // Tamén se poden eliminar as variables de sesión desta forma.
  

Revisión del 22:10 8 dic 2016

  • 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 ao principio da páxina php e antes de enviar nada ao explorador. 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:
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 ?>
 6 
 7 * 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].
 8 : Basicamente o que indica é que cando facemos un session_start() estamos cargando os datos gardados no disco do servidor no array global $_SESSION.
 9 : 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.
10 : 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.
11 : 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:
12 :::<syntaxhighlight lang="php" line enclose="div" highlight="" >
13 <?php
14 session_start();
15 .....
16 session_unset();
17 session_destroy();
18 ?>
19 
20 
21 * Vexamos un exemplo:
22 
23 * Arquivo '''UD4_session_Ex1_paxina1.php''':
24 ::<syntaxhighlight lang="java" line enclose="div" highlight="" >
25 <?php
26     session_start();
27 ?>
28 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
29     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
30 
31 <html>
32     <head>
33         <meta charset="UTF-8">
34         <title></title>
35     </head>
36     <body>
37 <?php
38     $_SESSION['nome']='angel';
39 
40 ?>
41         <h1>Posto o valor da variable session 'nome' a Angel.</h1>
42         <h2>Pulsa <a href='UD4_session_Ex1_paxina2.php'> para ver o seu valor</a> noutra páxina...</h2>.
43         
44         
45     </body>
46 </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     unset($_SESSION['nome']);
 3     unset($_SESSION['id']);
 4     // session_start(); 
 5     // session_destroy();   // Tamén se poden eliminar as variables de sesión desta forma.
 6 
 7 ?>
 8 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 9     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
10 
11 <html>
12     <head>
13         <meta charset="UTF-8">
14         <title></title>
15     </head>
16     <body>
17 <?php
18     printf("<h1>O valor da variable sesión é: %s</h1>",$_SESSION['nome']);
19     printf("<h2>O valor do ID de sesión é: %s</h2>",  session_id());
20 
21 ?>
22      <h2>Pulsa <a href='UD4_session_Ex1_paxina1.php'> para volver a darlle un valor</a>...</h2>.
23         
24     </body>
25 </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).