Lección 11: Sesiones

Una sesión, o cookie de sesión, es un variable que se guarda temporalmente en tu navegador y solo nosotros podremos ver su contenido. Con este mecanismo podremos:

  • Proteger páginas para que solo deban entrar los usuarios que estén identificados.
  • Guardar una información delicada del visitante y que nadie la pueda ver: nombre, número del documento de identidad, cumpleaños…
  • Aumentar la seguridad. En cuanto el usuario “cierra la sesión” (hablaremos más adelante del tema) se eliminará cualquier dato almacenado previamente.

No confundir las session con las cookie. Son muy similares y es fácil confundirlas. Las cookie son unas variables que también se guardan en el navegador del cliente pero si podrá verse su contenido y además su vida será más larga.

Crear una Sesión

Siempre que quieras activar una sesión debes iniciar previamente el sistema con session_start(), solo una vez. Después ya puedes usarlas tantas veces como quieras para todo lo que necesites.

En el ejemplo comprobarás que una sesión es en realidad un array llamada $_SESSION.

session_start();
$_SESSION['nombre'] = 'Goku';
$_SESSION['raza'] = 'Saiyan';

Para leer la variable.

session_start();
echo $_SESSION['nombre'];
// Goku

Comprobar si existe

Una variable de sesión es útil para saber si el usuario puede entrar en una página concreta.

Supongamos que nuestro usuario esta registrado en nuestra base de datos con apodo Bulma.

// Creamos la variable en algún momento
session_start();
$_SESSION['apodo'] = 'Bulma';

// Comproblamos si existe con isset()
if (isset($_SESSION['apodo'])) {
    // Si esta identificado, en otras palabras existe la variable, le saludamos
    echo 'Hola ' . $_SESSION['apodo'];
} else {
    // En caso contrario redirigimos el visitante a otra página
    header('Location: http://dragonball.jp/login.php');
    die();
}

Cuando hagas una redirección con header() siempre termina con un die() o exit(). Evitarás problemas de seguridad, puedes leer más al respecto en The Daily WTF.

Borrar

Al ser un array, la forma de borrar una sesión es igual.

session_start();
unset($_SESSION['apodo']);

En caso que quisiéramos borrar todas las sesiones sin ir una por una, lo que se llama coloquialmente como cerrar sesión, tenemos un método: session_unset().

session_start();
session_unset()

Modificar

No cambia mucho respecto a un array.

$_SESSION['apodo'] = 'Picolo';

Ejemplo de un sencillo login con página protegida

Vamos a disponer de 2 páginas: una pública y otra privada.

login.php es pública. Cualquier persona podrá entrar. El objetivo es la que un usuario se identifique y automáticamente le redireccione a su página de perfil. Los datos correctos para el formulario son:

  • Apodo: bulma
  • Contraseña: 123
<html>
    <body>
        <?php 
            // Comprobamos que nos llega los datos del formulario
            if ($_SERVER['REQUEST_METHOD'] == 'POST') {

                // Variables que teóricamente estarían en una base de datos
                $apodoBueno = 'bulma';
                $contrasenyaBuena = '123';
                
                // Variables del formulario
                $apodo = isset($_REQUEST['apodo']) ? $_REQUEST['apodo'] : null;
                $contrasenya = isset($_REQUEST['contrasenya']) ? $_REQUEST['contrasenya'] : null;

                // Comprobamos si los datos son correctos
                if ($apodoBueno == $apodo && $contrasenyaBuena == $contrasenya) {
                    // Si son correctos, creamos la sesión
                    session_start();
                    $_SESSION['apodo'] = $_REQUEST['apodo'];
                    // Redireccionamos a la página segura
                    header('Location: perfil.php');
                    die();
                } else {
                    // Si no son correctos, informamos al usuario
                    echo '<p style="color: red">El apodo o la contraseña es incorrecta.</p>';
                }
            }
        ?>
        <form method="post">
            <p>
                <input type="text" name="apodo" placebolder="Apodo"> 
            </p> 
            <p>
                <input type="password" name="contrasenya" placebolder="Contraseña"> 
            </p>
            <p>
                <input type="submit" value="Entrar"> 
            </p>
        </form>
    </body>
</html>

perfil.php es una página que nadie puede entrar si no pasa por la página anterior.

<?php 
// Comprobamos si existe la sesión de apodo
session_start();
if (!isset($_SESSION['apodo'])) {
    // En caso contrario devolvemos a la página login.php
    header('Location: login.php');
    die();
}
?>
<html>
    <body>
        <!-- Saludamos -->
        <h1>Bienvenido <?= $_SESSION['apodo'] ?></h1>
        <!-- Botón para cerrar la sesión -->
        <a href="logout.php">Cerrar sesión</a>
    </body>
</html>

logout.php: Para complementar se puede crear una página para cerrar la sesión.

<?php 
// Iniciamos las sesiones
session_start();
// Destruimos las sesiones
session_unset();
// Llevamos a login.php
header('Location: login.php');
die();

Con esto tenemos un sencillo sistema de seguridad para nuestras páginas.

9-1 9-2