Almacena la sesión del navegador en la BD con PHP

La mayoría de las aplicaciones web usan la sesión para almacenar información que podemos utilizar en todas las páginas que visitemos, así no será necesario pasarla por parámetro como muchas veces se hace (incorrectamente).
Normalmente la sesión se guarda en un fichero en el servidor, lo cual puede ser un problema, ya que si queremos usar varios servidores en cluster, la sesión no estaría disponible si en la siguiente página que visitamos, el servidor que atiende nuestra aplicación no es el mismo. Yo no soy experto en sistemas, pero si el sistema permite session-aware en el balanceo de carga, no nos encontraremos con este problema.
Si nos encontramos con ese problema y es necesario solucionarlo mediante programación, PHP nos permite gestionar las sesiones, indicando el modo de guardar y leer las sesiones. Para ello existe la función session_set_save_handler(), en la cual indicaremos los métodos para abrir, cerrar, leer, escribir, destruir y liberar sesiones.
En el artículo que referenciamos guardan la sesión en la base de datos, para lo cual habrá que crear una tabla que almacene el ID de la sesión, la información y la fecha de expiración. Las acciones de tratamiento de la sesión usarán esta tabla para almacenar y tratar la información de la sesión. Al abrir y cerrar la sesión no se debe hacer nada, leer leerá de la tabla según el ID dado y si no ha expirado, guardar insertará/modificará en la tabla guardando los datos, destruir borrará los datos de la tabla y liberar sesiones borrará de la tabla las sesiones que hayan caducado.
Storing PHP Sessions in a Database
Vía / PHPDeveloper.org

Laboratorio: controlar el tiempo de sesión con PHP

Una de las cuestiones que hay que tener en cuenta por temas de seguridad es controlar el tiempo en el que está activa la sesión. Por ejemplo, para evitar que una persona olvide “desconectarse” y otro aproveche su usuario cuando no esté.

Las sesiones en PHP se controlan con la variable $_SESION, que es un array que contiene las variables de sesión. En nuestro caso, comprobaremos si existe una variabla de sesión que contenga el ID de sesión, si la hay, se recupera el tiempo en el que empezó la sesión (un timestamp) y se comprueba si ha pasado el tiempo máximo de sesión activa (en nuestro ejemplo 1 minuto), si ha sobrepasado el tiempo, se borran los datos de la sesión.

Una vez comprobada si la sesión debe seguir activa, se comprueba si sigue existiendo la sesión (vamos, que si no hemos acabado con ella), miramos si se ha pedido crear la sesión, por ejemplo cuando nos hemos logueado, en este caso, nos creamos las dos variables de sesión: el id y el timestamp.

<?php
// Inciamos la sesión
session_start();
?>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"xhtml1-transitional.dtd">
<html>
<head>
<title>Sentido Web - Sessiones</title>
</head>
<body>
<p>
<?php
// Primero miramos si la sesión es válida
// Cuando el tiempo que lleva activa sea menor que 1 minuto
if (isset($_SESSION["ID_SESSION"])) {
$antes = $_SESSION["SESION_TIME"];
// Si lleva más de 1 minuto (60 segundos)
if (time()-$antes > 60) {
// Libramos la sesion
session_unset();
session_destroy();
echo 'Finalizó la sesión. <br/>';
}
}
// Si ya hay sesión lo indicamos
if (isset($_SESSION["ID_SESSION"])) {
?>
Hay SESIÓN (<?php echo $_SESSION["ID_SESSION"]; ?>)
<?php
// Si no hay sesión
} else {
// Si se ha pedido la creación de una sesion
if (isset($_GET["accion"])) {
// se quiere crear una sesion
// Se crea la variable de sesion id de sesion
// y tiempo en el que empieza la sesion
if ($_GET["accion"] == "1") {
$_SESSION["ID_SESSION"] = "ID".rand();
$_SESSION["SESION_TIME"] = time();
?>
Has creado la sesión <?php echo $_SESSION["ID_SESSION"]. " " .$_SESSION["SESION_TIME"]; ?>
<?php
// No se quiere crear la sesión
} else {
?>
No has querido crear sesión.
<?php
}
// No hay sesión, se avisa y
// se pregunta si se quiere crear una
} else {
?>
No hay SESIÓN. ¿Quiere crear una?
<input type="button" value="SI" onclick="document.location='sesion.php?accion=1'" />
&nbsp;
<input type="button" value="NO" onclick="document.location='sesion.php?accion=0'" />
<?php
}
}
?>
</p>
</body>
</html>