Desarrollo Android y Web

Me llamo Javier Hernández y soy desarrollador freelance de aplicaciones Android, iOS e híbridas, además de diseñador Web (WordPress, Tiendas online, desarrollos a medida), entre otras cosas

Seguridad básica en cookies con PHP

Una de las cosas que debemos tener en cuenta a la hora de trabajar con cookies, es que si no están protegidas, cualquiera podría duplicarlas y, por ejemplo, entrar en nuestro nombre a una web.

Vamos a ver una serie de pasos mínimos a tener en cuenta en cuanto a seguridad a la hora de crear cookies en nuestra web con PHP, tomando como ejemplo una cookie de logueo que almacena información del usuario, y con una base de datos MySQL.

Primera aproximación

En primer lugar, en MySQL debemos almacenar las contraseñas en MD5 (no sólo para usarlas en las cookies, si no para seguridad general de la Base de Datos), y para ello, si estamos introduciendo los datos desde un archivo en PHP, usaremos la función md5, ejemplo:

$contrasenya = md5($contrasenya);

Incluso podríamos aumentar la seguridad de la contraseña usando una «semilla» creada por nosotros con caracteres aleatorios unida a la contraseña y cifrar ambos con un algoritmo sha1 para que fuera casi imposible de descifrar, quedando del siguiente modo:

$semilla = «fs5Jç-1p.»
$contrasenya = sha1($semilla.md5($contrasenya));

Una vez que tenemos todas las contraseñas cifradas en la Base de Datos, podemos utilizarlas en las cookies.

¿Por qué hacemos esto? Porque si solo usamos, por ejemplo, el nombre de usuario para loguearnos con una cookie, cualquier usuario que conociera ese dato podría crear una cookie solo con esa información y podría suplantarnos.

Para evitarlo, como hemos dicho, utilizaremos la cookie con información del usuario además de la contraseña cifrada. Para ello, una opción podría ser generar la cookie con una cadena del estilo:
«emailDelUsuario@algo.com|contrasenyaCifrada»

Con este nuevo método, hace falta saber la contraseña y el email para poder crear la cookie, y por lo tanto, a la hora de comprobar los datos tendríamos que hacer lo siguiente:

  • Separar el email y la contraseña en el string.
  • Comprobar que la contraseña de la cookie coincide con la contraseña almacenada en la Base de Datos para ese usuario en concreto.

Nota: Otra forma de almacenar la cookie podría ser cifrar el email del usuario en la cookie de un modo similar a cómo hemos cifrado la contraseña, y de este modo no necesitaríamos agregarle la contraseña, ya que sólo nosotros sabríamos cómo comprobar si el email coincide (aplicando la misma transformación al email de la base de datos). Esto además tiene el añadido de que nadie puede leer con qué email estamos registrados.

Sin embargo, este sistema tiene un problema de seguridad, y es que si alguien tiene acceso a nuestro ordenador podría ver la cookie, duplicarla, etc. Pero para una primera aproximación en la seguridad en las cookies, y depende de para qué sea la web, nos puede valer.

Segunda aproximación

En caso de que queramos aumentar aún más la seguridad, una posible solución podría ser:

  • Para evitar casos en los que el usuario no cierre sesión y para aumentar la seguridad, deberíamos dar la opción de «recordarme» para crear una cookie. Para el resto de casos utilizar una session.
  • En caso de utilizar la cookie, generar una frase aleatoria en PHP de «x» caracteres junto con la fecha-hora de validez justo después de hacer el login, pero antes de crear la cookie de usuario. Un ejemplo de frase podría ser:
    sdak19sj1sk0sdsad313sa4|08/10/2012-17:04:50

    (Añadir la fecha-hora de validez a la frase nos sirve por si el usuario no cierra sesión, y por lo tanto se mantiene la frase en la base de datos [la borramos al cerrar sesión] y nos duplican la cookie).

  • Agregar la frase a la base de datos para ese usuario.
  • Agregar la frase a la cookie, de modo que quedaría: «email|frase», ya que al tener la frase no necesitamos comprobar la contraseña cada vez.
  • Cuando necesitemos comprobar la identidad, comprobar que los 2 campos coincidan con los de nuestra base de datos, sabiendo que esa frase solo puede ser válida para esas horas.
  • Eliminar la frase cuando el usuario cierre sesión. De nuevo la frase será creada cuando iniciemos sesión con nuestro nombre de usuario y contraseña con la opción de «recordarme». Como hemos dicho, aunque no cierre sesión, tenemos una seguridad extra sabiendo la validez de esa frase. 

Nota: La validez de la frase se podría expresar también en otro campo de la base de datos, en lugar de ir implícita en la misma frase.

Hay otros modos de aumentar la seguridad en cookies, pero esta es una manera sencilla de implementar, y que evita los grandes agujeros de seguridad en las cookies.

Un pequeño esquema de cómo quedaría:

Cookies Security, PHP. Seguridad en Cookies.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

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