¿Qué tan seguras son las sesiones de PHP?

Seguramente escuchaste alguna versión de estas preguntas:

¿Es posible que alguien modifique sus cookies, les otorgue diferentes privilegios o inicie sesión como un usuario diferente?

¿Puede alguien robar las variables mientras están guardadas en el lado del servidor?

¿Que tan posible es que alguien te copie una session para usarla en su navegador?

Una de nuestras principales preocupaciones como desarrolladores de software es la posibilidad de que algún hacker pueda robar información que los usuarios han confiado a nuestras aplicaciones.

Si eso llegara a suceder nuestros clientes podrían verse en serias dificultades (y por lo tanto, nosotros también).

Existen muchos modos en que un atacante puede colarse en nuestros sistemas y, lamentablemente, las sesiones no están exentas de riesgos.

Para qué sirven las sesiones en PHP

Las sesiones de PHP son un modo bastante cómodo de compartir información entre peticiones.

Un ejemplo clásico es el login: independientemente de cuál sea el método de autenticación usado, una vez validada la identidad del visitante, es necesario indicar a las siguientes páginas que este usuario está autorizado a verlas.

Para ello un modo muy común es utilizar el arreglo $_SESSION con algún código similar a:

 <?php

// Obtener el $userId de la base de datos
session_start();
$_SESSION['userId'] = $userId;

Y, en las siguientes páginas tener un chequeo similar a:

 <?php

session_start();
if (empty($_SESSION['userId'])) {
  header('Location: login.html');

  die;
}

Usar las sesiones no es realmente complejo pero si para responder qué tan seguras son las sesiones primero debemos comprender cómo funcionan internamente.

Cómo funcionan las sesiones en PHP

Del lado de nuestros scripts tenemos ese arreglo superglobal ($_SESSION) que, en principio, puede guardar cualquier valor que se desee y estará ahí cuando lo necesitemos.

Existen varias formas de almacenar esta información. La más común es la utilización de archivos temporales en algún lugar del disco del servidor, aunque existen varias alternativas (Puedes consultar más sobre esto en el manual de PHP).

Claro que un mismo servidor web puede estar atendiendo a muchos visitantes a la vez (al menos eso es lo que esperamos que suceda :)), de modo que necesitamos alguna forma de asociar ese archivo en el disco del servidor al visitante que realizó la solicitud:

Múltiples clientes son atendidos en forma simultánea por un servidor web

El protocolo HTTP (En el que se basa la web) pertenece al conjunto conocido como sin-estado (stateless).

Esto significa que cada petición es independiente de las otras… ¡lo cual es precisamente lo contrario de lo que necesitamos!

Debido a esta característica de HTTP, cada aplicación que quiera vincular una petición con otras deberá hacerlo por sus propios medios.

En el caso de PHP la forma de asociar a un visitante con su sesión es agregar un parámetro a cada petición: el ID de sesión.

Hoy en día lo más usual es guardar este id en una cookie especial (La cookie de sesión) y de ese modo asegurarse de que este valor:

  • Acompañe al usuario en su recorrido por nuestro sitio
  • Desaparezca en forma automática cuando ya no se lo necesita

Qué riesgos presentan las sesiones de PHP

Como vemos, toda la información de las sesiones está almacenada del lado del servidor, con lo cual, el riesgo de que alguien acceda a dicha información se reduce a dos posibilidades:

  1. Que una persona no autorizada pueda acceder directamente a los archivos del servidor
  2. Que un atacante suplante la identidad de un usuario que ha iniciado sesión

Evitar el primer riesgo no depende de nuestro código si no de la configuración del servidor.

Una forma de atacar una aplicación web a través del mecanismo de sesiones consiste en el secuestro de la sesión (session hi-jacking).

De lo que se trata es de copiar el contenido de una cookie de sesión y crear con él otra cookie en otra computadora.

Si no se han tomado medidas precautorias, el servidor no será capaz de distinguir a un visitante del otro.

Obtener una cookie de sesión no es algo sencillo pero tampoco imposible.

Basta con:

  • Tener acceso a la computadora de la víctima
  • Interceptar el tráfico de red (Suponiendo que no esté cifrado)
  • Ejecutar un ataque de tipo XSS

En definitiva: las seguridad de las sesiones depende fuertemente de qué tan seguro sea el mecanismo de validación de identidad de un visitante.

mchojrin

Por mchojrin

Ayudo a desarrolladores PHP a acceder mercados y clientes más sofisticados y exigentes

2 comentarios

¿Te quedó alguna duda? Publica aca tu pregunta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.