Sesiones en PHP

Las sesiones son una serie de variables que estarán almacenadas en nuestro servidor y que nos van a proporcionar información sobre nuestros usuarios y serán diferentes para cada uno de ellos.
En este capítulo explicaremos cómo crear y cerrar sesiones, así como las principales ventajas del paso de variables con el uso de sesiones.

Qué son y cómo funcionan

Mediante el uso de sesiones podremos realizar un seguimiento a nuestros usuarios durante el tiempo que estén conectados a la misma.
La sesión será creada desde que el usuario se conecte a nuestro sitio web, y a partir de este momento todas las solicitudes y visitas que realice a las diferentes páginas podrán ser seguidas gracias a la sesión que se creó al comienzo.
La creación de una sesión lleva asociada la creación de un identificador (id de sesión) de tal manera que relacionará de forma unívoca al usuario con dicha sesión, para de esta forma, mediante nuestras técnicas de programación, poder registrar una serie de variables como variables de sesión, que serán almacenadas en el servidor. La única información de una sesión que podrá ser consultada desde el lado del cliente será
este Id. de sesión.

El Id. de sesión será almacenado como una “cookie” en el equipo cliente, aunque también podrá ser propagado mediante una URL.
Las operaciones básicas que realizaremos en el uso de sesiones serán las siguientes:

  • Iniciar una sesión.
  • Registrar variables de sesión.
  • Utilizar variables de sesión.
  • Anular las variables registradas y eliminar la sesión.

El enfoque de control de sesiones ha sufrido alguna modificación desde versiones anteriores de PHP, gracias a la aparición de las variables superglobales. En el caso de las sesiones, la variable global $_SESSION, en realidad es un array asociativo que va a contener las variables de sesión que estén disponibles para nuestro script actual.

Por otra parte, es necesario conocer que el soporte para las sesiones estará habilitado por defecto en PHP y que la ruta donde será almacenada toda la información relativa a las sesiones, se podrá consultar o modificar en la opción “SESSION.SAVE_PATH” del fichero PHP.INI.

Creación de una sesión

Para comenzar a beneficiarnos del uso de las sesiones, en primer lugar tendremos que ejecutar las instrucciones precisas para crearlas. Esta operación la realizaremos mediante la función session _start().
Esta función, en primer lugar, comprobará si ya existe una sesión abierta mediante la comprobación de un Id. de sesión actual, y si no, creará una en el mismo momento.

Podremos consultar el Id. de sesión mediante la función session_id(). Esta función será también utilizada cuando queramos propagar el identificador de la sesión de usuario a otras páginas dentro de nuestro sitio web para mantener la información del usuario.

Si se diera la circunstancia de que la sesión ya estuviera creada, realizaría una carga de las variables de sesión que estén registradas para que podamos volver a utilizarlas.

Por lo tanto, una buena práctica será realizar una llamada a la función session_start() antes de realizar cualquier otro tipo de operaciones relacionadas con sesiones.

Existe una segunda alternativa para la creación de forma automática para las sesiones y es a través de la opción session.auto_start en el archivo de configuración PHP.INI.

Pero tiene un inconveniente, y es que si habilitamos esta opción, no podremos utilizar objetos como variables de sesión.

Veamos un ejemplo sencillo en el que crearemos una sesión y mostraremos el valor del Id. de sesión:

<?php
echo " ";
session_start();
?>
<HTML>
<BODY>
<?php
echo "El identificador de la sesión es: " . session_id().
"<br>";
?>
</BODY>
</HTML>

Una vez que hemos creado nuestra primera sesión, podemos comenzar a registrar variables de sesión almacenando sus valores en el array asociativo $_SESSION, de tal forma que podemos especificar el nombre de la variable como el índice, y a continuación, su valor. Veamos un ejemplo:

<?php
session_start();
$_SESSION["nombre"] = "Silvia Ruiz";
$_SESSION["edad"] = 32;
if (!isset($_SESSION['contador'])) {
$_SESSION['contador'] = 0;
} else {
$_SESSION['contador']++;
}
echo "El valor de la variable NOMBRE es: " . $_SESSION['nombre'] .
"<br>";
echo "El valor de la variable EDAD es: " . $_SESSION["edad"] .
"<br>";
echo "El valor de la variable CONTADOR es : " .
$_SESSION["contador"] . "<br>";

En el ejemplo anterior podemos aprender, en primer lugar, cómo se registran las variables en la variable superglobal $_SESSION. Pero además, podemos comprobar cómo esos valores son guardados cada vez que refrescamos la página con el botón “Actualizar” del navegador. En el caso de la variable “contador”, podemos comprobar que no solo mantiene su valor inicial, sino que es modificado en cada carga de la página, aumentando su valor, mientras el resto de las variables permanecen inalteradas.

En esta ocasión, hemos visualizado las variables y sus contenidos realizando un llamamiento directo, utilizando como índice el nombre de la variable, pero también podríamos utilizar el bucle “FOREACH” para recorrer todos los valores que estén almacenados en la variable $_SESSION de la siguiente forma:

echo "Mostrar las variables de sesión". "<br>";
foreach ($_SESSION as $indice => $valor) {
echo "$indice: $valor ". "<br>";
}

Si necesitamos eliminar o dejar de registrar una variable que haya sido añadida previamente a $_SESSION, podremos utilizar la función unset() de la siguiente forma:

unset($_SESSION['contador']);

Cerrar una sesión

En el apartado anterior hemos comprobado cómo podemos dejar de registrar una variable.

Tendremos que tener cuidado con el uso de la función unset() en el uso de sesiones, ya que si, por ejemplo, intentáramos destruir una sesión mediante la instrucción unset($_SESSION), estaríamos deshabilitando el registro de las variables a través de la variable superglobal $_SESSION.

Esto está directamente relacionado con la forma de cerrar una sesión. Para finalizar la sesión actual, en primer lugar, tendremos que borrar todas las variables registradas en el proceso, y a continuación, podremos destruir la sesión mediante la función sesión_destroy().

Veamos un ejemplo de cómo sería el cierre correcto de una sesión:

$_SESSION = array();
session_destroy();

En la primera instrucción eliminamos todas las variables registradas en la sesión. Realmente estamos reinicializando la variable superglobal $_SESSION mediante la asignación de la función array(), que creará un nuevo array vacío. A continuación, destruimos la sesión de forma definitiva.

Paso de variables por sesión

Existen tres formas de mantener y continuar una sesión mientras el usuario sigue navegando por nuestra página web:

  • Mediante la propagación del Id. de sesión por URL.
  • Por cookies.
  • Propagación automática.

Por URL

Mediante este método, podremos enviar el Id. de sesión en las URL como un parámetro más. Este método, tendrá sus ventajas e inconvenientes.

Por una parte, será más fiable que las cookies con respecto a que nos aseguramos de que el cliente siempre recibirá el Id. de sesión, mientras que con las cookies, no podremos asegurar que todos los clientes las tengan habilitadas en su navegador.

Por otra parte, en lo relativo a la seguridad, será menos fiable, ya que exponer el PHPSESSID de esta forma nos podrá traer problemas, ya que se está haciendo público dicho identificador a otras personas o programas que pudieran estar al acecho.

En este caso, podremos hacer uso de la constante “SID” que va a contener el nombre de la sesión y el identificador de la forma “name=ID” o una cadena vacía, de tal forma. Veamos un ejemplo de cómo sería el paso de Id. de sesión mediante propagación por URL.

En primer lugar, tendríamos el archivo donde estableceríamos el valor de las variables que queremos registrar, y donde crearemos el enlace para propagar el Id. de sesión:

<?php
session_start();
$_SESSION["nombre"] = "Silvia Ruiz";
$_SESSION["edad"] = 32;
if (!isset($_SESSION['contador'])) {
$_SESSION['contador'] = 0;
} else {
$_SESSION['contador']++;
}
$id_sesion=SID;
echo "<a href=\"URL2.php?$id_sesion\">Pasar variables</ a>";

Por otra parte, tendríamos el fichero “sesion2.php” donde para comprobar que todo se ha recibido correctamente, visualizamos todos los valores:

<?php
session_start();
echo "Mostrar las variables de sesión".
"<br>";
foreach ($_SESSION as $indice => $valor) {
echo "$indice: $valor ". "<br>";
}
?>

Por Cookie

Según podemos observar el manual oficial de PHP, las sesiones que están basadas en cookies son más seguras que las que están basadas en URL. A partir de la versión 5.2.13 de PHP, podremos encontrar por defecto en el fichero PHP.INI los siguientes valores para configuraciones de las sesiones, que podrán ser modificadas en el mismo momento en el que estemos ejecutando nuestro script:

  • session.use_cookies. Mediante esta opción podremos especificar si PHP usará cookies para propagar las sesiones. Por defecto se establece en 1.
  • session.use_only_cookies. Mediante esta opción podremos especificar si queremos que PHP solo use cookies para almacenar el Id. de sesión en el navegador del cliente, y por lo tanto, prohibiendo la opción de propagarlo por URL. Su valor predeterminado es 1, y está fuertemente recomendado para evitar la suplantación de sesiones (hijacking).

Propagación automática

Afortunadamente, tenemos una tercera alternativa para la propagación del Id. De sesión. Es decir, sin tener que utilizar la constante “SID” para dicha propagación, y de esta forma evitar el riesgo que supone para la seguridad filtrar “SID”.

Realizar esta propagación automática será posible gracias a la opción que podemos encontrar en PHP.INI y cuyo nombre es session.use_trans_sid. Mediante esta opción podremos especificar que el Id. de sesión sea comunicado a través de URL entre el navegador y el usuario de forma transparente. De esta forma, no tendremos que incluir el identificador en cada petición o respuesta. Por defecto encontraremos su valor a 0.

En este caso, podremos hacer uso de la constante “SID” que va a contener el nombre de la sesión y el identificador de la forma “name=ID” o una cadena vacía, si estamos usando la opción de sesiones basadas en cookies. Si queremos usar sesiones que no estén basadas en cookies sino en URL, deberemos de poner la opción session. use_only_cookies a 0 y a continuación, esta opción a 1.

Para habilitarla, podremos editar el fichero PHP.INI tal y como hemos indicado, o bien ejecutar la función ini_set() de la siguiente forma:

ini_set("session.use_trans_sid","1");

De esta forma, en el enlace que proporcionamos en nuestro anterior ejemplo para pasar al otro fichero, donde comprobaremos que las variables han sido pasadas correctamente, bastará con escribir lo siguiente:

echo “<a href=\”sesion2.php”>Pasar variables</a>”;

Hay que contemplar la posibilidad de que el usuario tenga deshabilitadas las cookies en su ordenador, ya que no podremos obligarle a que las tenga habilitadas.

Manejo de sesiones con clases

Para seguir practicando con el manejo de sesiones, y profundizar algo más en el uso de clases y objetos, vamos a realizar un ejemplo que va a constar de tres archivos:

clase_sesion.php. Que va a contener la clase que utilizaremos para las principales funciones.

prueba.php. Realizará la instancia de la clase y registrará los primeros valores mediante los métodos de la clase y realizará el paso de valores al siguiente script, prueba2.php.

prueba2.php. Mostrará por pantalla los valores actuales de la sesión mediante la instancia de la clase y recuperación de valores.

El código con el que definimos la clase, en el fichero clase_sesion.php:

<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
class Sesion
{
function __construct(){
session_start();
}
public function set ($nombre, $valor){
$_SESSION[$nombre]=$valor;
}
public function get ($nombre){
if (isset ($_SESSION [$nombre])){
return $_SESSION [$nombre];
}
else{
return false;
}
}
public function borrar_variable ($nombre){
unset ($_SESSION [$nombre]);
}
public function borrar_sesion(){
$_SESSION= array();
session_destroy();
}
}

Veamos el código con el que instanciamos la clase, y registramos los primeros valores, en el fichero clase_sesion.php:

<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
?>
<?php
require ("clase_sesion.php");
$sesion = new Sesion();
$sesion->set ("nombre", "Silvia Ruíz");
$sesion->set ("edad", "32");
$id_sesion = SID;
echo "<a href=\"prueba2.php?sid_session\">Pasar variables<\ a>";
?>

El código con el que instanciamos la clase, y recuperamos valores de la sesión, eliminamos valores y eliminamos la sesión mediante los métodos de la claseoriginal, en el fichero clase_sesion.php:

<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
require ("clase_sesion.php");
$sesion = new Sesion();
echo $sesion->get ("nombre") . "<br>";
echo $sesion->get ("edad") . "<br>";
$sesion->borrar_variable ("nombre");
$sesion->borrar_sesion();
?>

Ventajas y desventajas del uso de sesiones

Una sesión, como una cookie, nos suministra una forma de poder guardar datos de un usuario en una serie de páginas. La principal diferencia entre ambas, es que las cookies son almacenadas en el equipo del cliente y los datos de las sesiones son guardados en el servidor. Esto puede ser una ventaja o un inconveniente según se mire.

Pero las sesiones tienen otras ventajas sobre las cookies:

  • Las sesiones por lo general son más seguras, porque los datos no son enviados entre el cliente y el servidor de forma repetida.
  • Las sesiones nos permitirán almacenar más información que la que podemos almacenar en una cookie.
  • Aunque un usuario no acepte trabajar con cookies en su navegador, podremos seguir trabajando igualmente.