# Sesiones (PHP)
Las sesiones permiten mantener y manejar la información de los usuarios en el servidor mediante el array (Variable Super Global) **$_SESSION**. Es decir, que las sesiones permiten que páginas distintas puedan acceder a esta variable común.
A cada usuario que accede a la aplicación e inicia sesión se le asigna un **identificador de sesión session ID único**, que permite identificar la sesión y que está disponible para ese usuario en concreto.
De esta forma **en el cliente se almacena sólo este identificador de sesión** y cualquier **información** de la sesión se **guarda en el lado del servidor**.
## Ventajas
- **Proteger páginas para que solo deban entrar los usuarios que estén identificados**.
- **Guardar 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” se eliminará cualquier dato almacenado previamente. Además de que los datos se guardan en el servidor y no en el cliente
- **Pueden funcionar aunque el usuario desactive las cookies**, aunque para ello hay que pasar el identificador de sesión mediante GET; es decir, el identificador de la sesión será visible en la barra de direcciones del navegador.**PHP por defecto utiliza cookies para pasar el identificador de sesión**, si no lo queremos pasar por cookies, debemos modificar varios parámetros del archivo de configuración de PHP.
- Almacena más información que una cookie y además son capaces de almacenar datos binarios.
## Desventajas
- Son susceptible al ataque conocido como secuestro de sesión (session hijacking), mediante el cual un usuario se puede hacer con el identificador de sesión de otro usuario y hacerse pasar por él. El paso de ese identificador es el cuello de botella del sistema de sesiones.
- El identificador de sesión se almacena normalmente mediante cookies, por lo que si no nos damos cuenta, podríamos tener la misma dependencia con el usuario que en el caso de las cookies. Si el usuario las desactiva, no podremos utilizar sesiones.
## Creación y Uso
En PHP, las sesiones se crean mediante la función **session_start()**.
- **Si la sesión no existía**, esta función crea la sesión y le asocia un identificador de sesión único.
- **Si la sesión ya existía**, esta función permite que la página tenga acceso a la información vinculada a la sesión (siempre que las páginas asociadas tengan la misma sesión). Es decir, todas las páginas que quieran guardar datos en $_SESSION o leer datos de $_SESSION deben comenzar con la función session_start().
**IMPORTANTE**: La creación de sesiones requiere el envío de cabeceras HTTP (Igual que las Cookies), por lo que la función session_start() debe utilizarse antes de empezar a escribir el contenido de la página. En caso contrario PHP producirá un aviso y no se creará la sesión.
**IMPORTANTE**: Debemos tener en cuenta que los nombres de los índices de la matriz **$_SESSION** cumplen con las reglas que los nombres de las variables (el primer carácter debe ser una letra o un guion bajo) y además no deben ser números ni contener caracteres no alfanuméricos.
*Ejemplo (Página que crea una sesión)*
```php=
<?php
session_start();
$_SESSION["name"] = "Pepe";
echo "<p>Pincha <a href="./pag2.php">aquí</a> para ver los datos de sesión</p>";
?>
```
*Ejemplo (Página que lee los datos de la sesión)*
```php=
<?php
session_start();
echo "<p>El nombre es" . $_SESSION["name"] . "</p>";
echo "<p>Pincha <a href="./pag1.php">aquí</a> para volver a la página 1</p>";
?>
```
Es buena práctica establecer un **nombre de sesión**, para ello hacemos uso de la función **session_name(string name)**.
**Si no lo utilizamos, todas las páginas acceden a la misma $_SESSION dentro del mismo dominio**, puesto que la sesión es única.
**IMPORTANTE**: Recuerda que todas las páginas que hagan uso de dicha sesión deben tener ese nombre de sesión.
*Ejemplo (Página que crea una sesión con session_name)*
```php=
<?php
session_name("user");
session_start();
$_SESSION["name"] = "Pepe";
echo "<p>Pincha <a href="./pag2.php">aquí</a> para ver los datos de sesión</p>";
?>
```
*Ejemplo (Página que lee los datos de la sesión con session_name)*
```php=
<?php
session_name("user");
session_start();
echo "<p>El nombre es" . $_SESSION["name"] . "</p>";
echo "<p>Pincha <a href="./pag1.php">aquí</a> para volver a la página 1</p>";
?>
```
## Cierre de la Sesión
Tanto el usuario como el servidor pueden cerrar la sesión. El **usuario** puede destruir la sesión **cerrando el navegador**. El **servidor** puede destruir la sesión cuando alguna página utilice la función **session_destroy**().
**IMPORTANTE**: Hay que tener en cuenta que la página que destruye la sesión sigue teniendo acceso a la variable **$_SESSION** y a sus valores, pero las páginas posteriores ya no.
*Ejemplo (Página que crea una sesión y la cierra)*
```php=
<?php
session_name("user");
session_start();
$_SESSION["name"] = "Pepe";
session_destroy();
echo "<p>El nombre es" . $_SESSION["name"] ?? "sin definir" . "</p>"; // Pepe
echo "<p>Pincha <a href="./pag2.php">aquí</a> para ver los datos de sesión</p>";
?>
```
*Ejemplo (Página que lee los datos de la sesión)*
```php=
<?php
session_name("user");
session_start();
echo "<p>El nombre es" . $_SESSION["name"] ?? "sin definir" . "</p>"; // sin definir
echo "<p>Pincha <a href="./pag1.php">aquí</a> para volver a la página 1</p>";
?>
```
## UT3: Sesiones y Cookies
[Documentación General](https://hackmd.io/@bd1-NGPOSje0xW9PiI2fSQ/SJ5IDhnDo)
###### tags: `DSW` `UT3` `Platzi`