martes, 3 de febrero de 2009

Autentificación usando PHP+MySQL y Cookies

En mi proyecto número tres, el de crear un juego, me vi en la necesidad de autentificar usuarios. Tras ver diferentes formas, bien usando sesiones, usando HTTP, cookies... me decidí por esta última.
Lo cierto es que me pareció la más interesante de todas, además de que las cookies se tratan de una forma muy sencilla en PHP. Voy a pasar a explicar cómo lo hicimos:

En primer lugar se requiere una página para hacer el login:



Ahí tenemos un formulario que enviará los datos introducidos con el nombre T1 y T2 a la página login.php, que se encargará de realizar las comprobaciones.

Entrando en el código PHP tomamos las variables enviadas de la forma habitual:



Ahora tenemos que comprobar que los datos introducidos coinciden con los almacenados en nustra base de datos, para ello usamos el siguiente código:



La llamada a mysqlconnector.php no es más que traer el código que nos de conexión a la base de datos, almacenado en un archivo con ese nombre y con el siguiente contenido:



En la consulta a la base de datos sustituyo los valores con los que hay que comparar el nombre y la contraseña por los datos enviados desde el formulario. El password no está almacenado directamente, por seguridad se ha guardado un hash del mismo en MD5. Voy a tener que ir pensando en cambiarlo a SHA1, en vista de que MD5 ha sido hackeado.
En cualquier caso de momento funciona y hay maneras sencillas de cambiar un MD5 por un SHA1 con un pequeño cambio en la base de datos y cambiando las llamadas a la función.

Si todo ha salido bien la BD nos devolverá un único resultado. Lo comprobaremos y crearemos las cookies si es necesario:



Tras la comprobación de la existencia de resultados se guarda el tiempo actual y se almacenan dos cookies, una con el nombre de usuario y otra con el tiempo de entrada. Esta segunda con el propósito de garantizar la seguridad de la cuenta del usuario. Después de almacenar las cookies se hace un UPDATE en la tabla de usuarios guardando el tiempo de acceso, que es el mismo que está almacenado en la cookie. De esta manera si alguien intenta acceder a nuestra cuenta debería no sólo crear una cookie con el nombre del usuario, un dato fácil de obtener, si no también tener otra con el tiempo de entrada. Queda claro que es difícil hacer trampa y suplantar a otro usuario. Este valor se puede cambiar por otro que resulte más aleatorio y de igual manera almacenarlo tanto en el equipo del usuario como en la base de datos en el servidor.

A partir de aquí queda el trabajo de implementar el resto de funcionalidades que se quieran ofrecer. Un consejo útil es poner este código en la página principal (y en cualquier otra que se quiera) de nuestra web:



Vemos lo fácil que es usar las cookies en PHP. Esto sirve para comprobar la cookie del nombre y si se ha encontrado dar la posibilidad al usuario de continuar o desconectar, o en caso de que no se encuentre mostrar la página de login de la forma habitual. No he comprobado el valor time_check porque en este caso lo compruebo en una página posterior (principal.php), pero está claro que se podría hacer.

Para desconectar se hace una llamada a una página que se encarga de vaciar las cookies y redirecciona de nuevo a la pantalla principal.
Las cookies las elimino (escrito al inicio de la página):



El redireccionamiento lo hago usando una etiqueta meta:



Aunque no hay que olvidarse de poner un enlace típico de "si no es redireccionado en 3 segundos pulse aquí".

Y así termina la autentificación con cookies. Probablemente no sea la mejor manera, pero está probada y funciona de momento sin problemas.
Como siempre, se aceptan sugerencias.

No hay comentarios:

Publicar un comentario