27 January 2009 ~ 27 Comments

Ejercicio PHP: Autenticación de usuarios con sesiones en PHP y MySQL

PHP

Este es un ejemplo simple de autenticación de usuarios usando sesiones en PHP y consultando a una base de datos en MySQL. Voy a evitar pegar demasiado código en el post y me limitare a colocar enlaces hacia otra ubicación donde sea mas inteligible el mismo. (Solo pondré las partes esenciales en el post, el resto de código está en los enlaces)

En primer lugar, algunos datos necesarios:

  • Servidor: localhost
  • Usuario: usuario_mysql
  • Password: clave_mysql
  • Nombre de la base de datos: ejemplos

Luego el esquema simple de la tabla usuarios, que almacenara el nombre del usuario y la clave.

La manera mas práctica de organizar funciones en PHP es ubicarlas en un solo archivo, en este caso lo denominare funciones.php y este es su contenido. Este archivo posee funciones que permiten conectarse a la base de datos, consultar la existencia de un registro en la misma y verificar si la sesión fue iniciada con el nombre de usuario, cada vez que se desee utilizar solo bastaría poner include(‘funciones.php’) para incluirlo en cualquier script PHP.

Una vez que tenemos las funciones creadas, ya podemos empezar con el formulario de entrada (index.php), lo importante es que contenga algo tan simple como esto:

<form method=’POST’ action=’index2.php’>
Usuario <input type=’text’ name=’usuario’/><br/>
Password <input type=’password’ name=’clave’><br/>
<input type=’submit’ value=’Ingresar’/><br/>
</form>

Este formulario enviara dos valores (usuario y clave) hacia el archivo index2.php, este archivo recogerá los datos enviados y los usará en la función conexiones(), si el usuario existe se iniciará la sesión e ingresará a las páginas permitidas para el usuario (ingreso.php, sistema.php), si no existe volverá al formulario de ingreso.

<?php
include (‘funciones.php’);
//usuario y clave pasados por el formulario
$usuario = $_POST['usuario'];
$clave = $_POST['clave'];
//usa la funcion conexiones() que se ubica dentro de funciones.php
if (conexiones($usuario, $clave)){
header(‘Location:ingreso.php’);
} else {
header(‘Location: index.php’);
}
?>

Ingreso.php y todas las páginas que se desean mantener disponibles solo a usuarios registrados deberán tener la forma de:

<?php
include (‘funciones.php’);

if (verificar_usuario()){
//aqui debe venir todo el contenido necesario que solo el usuario validado puede acceder
print “Desconectarse <a href=’salir.php’/>aqui</a>”;
} else {
header(‘Location:index.php’);
}
?>

Donde se usa la función verificar_usuario(), para permitir el acceso si es que el nombre del usuario fue configurado en una sesión, si la función devuelve un valor falso, retornara al formulario de entrada. Es necesario que todas las paginas posean parte de este código, así se evitará que un intruso pueda poner la url de una pagina interna y esta sea visible o accesible sin haber verificado al usuario.

Para salir del sistema y borrar la sesión se usa el archivo salir.php, este archivo contiene instrucciones para destruir la sesión y volver al formulario de ingreso, también esta validado solamente para usuarios verificados:

<?php
include (‘funciones.php’);
if (verificar_usuario()){
session_unset();
session_destroy();
header (‘Location:index.php’);
} else {
header (‘Location:index.php’);
}
?>

Lo que no se debe olvidar al agregar mas paginas al sitio es incluir el archivo de funciones.php y usar la función verificar_usuario() para poder elegir entre el contenido al que debe acceder el usuario validado y el contenido para el visitante (usuario no validado).

Este ha sido un ejemplo simple de uso de sesiones en PHP, consultando a una base de datos en MySQL, existen muchas formas de lograr esto y obviamente mejorarlo, este es solo un ejercicio, útil para comprender el uso de sesiones.

Happy PHP Coding :)

Tags:

27 Responses to “Ejercicio PHP: Autenticación de usuarios con sesiones en PHP y MySQL”

  1. Diego Escalante Urrelo 27 January 2009 at 16:10 Permalink

    Para los que van a copiar este ejemplo ciegamente, $_POST y ningún otro dato enviado por usuarios debe usarse directamente en nuestro código sin sanearlo antes.

    El ejemplo de Sergio es tan solo para *ilustrar* cómo funcionan las sesiones, no lo clonen.

  2. neosergio 27 January 2009 at 16:45 Permalink

    eso :D lo que dice Diego es muy cierto, el uso de $_POST y cualquier función que permita al usuario ingresar valores, deben complementarse con otras funciones que eviten que se puedan ingresar valores no permitidos y así sufrir ataques.

    Aquí algunos detalles adicionales:
    http://www.onlamp.com/pub/a/php/2003/03/20/php_security.html

    happy coding

  3. walther 26 February 2009 at 16:30 Permalink

    si podria colgar el codigo de cargar imagenes en php y mysql .. gracias

  4. Segundo 30 March 2010 at 19:03 Permalink

    Mil gracias esta bien explicado

  5. Vane 29 May 2010 at 15:20 Permalink

    Profesor Sergio, una pregunta si es un sitio web en la que todos entraran para ver mi sistema de incidencias, entonces ya no manejo autentecacion de usuarios ?, o estaba pensando que la página tenga permisos osea el usuario que es administrador tenga permisos despues de logarse para administrar el sitio, y los que no, solo vean listas de las incidencias que ocurren.
    uyyy creo que me enrede jeje, bueno tengo esa duda :)

  6. neosergio 31 May 2010 at 23:27 Permalink

    Permisos para el administrador y moderadores, el resto debe ver la lista de incidencias pero no editarla.

  7. José Luis 16 December 2010 at 00:48 Permalink

    Muy bueno el ejercicio, claro como el agua.

    Se agradece!

    José.

  8. marcos 18 April 2011 at 11:51 Permalink

    esta bueno el tutorial

  9. Fran 3 November 2011 at 14:45 Permalink

    Muchas gracias. El mejor tutorial sobre autentificación que he encontrado. Enhorabuena por el trabajo

  10. gustav cast 4 November 2011 at 20:29 Permalink

    seria interesante agregarle a este ejemplo la parte de encriptacion y administracion de cuentas :p

  11. Horacio 15 December 2011 at 21:35 Permalink

    Hola, me funciona todo correcto mi pregunta es como seria para al entrar el usuario tenga la opcion de ver su perfil (sus datos) individualmente

  12. neosergio 19 December 2011 at 13:05 Permalink

    Para ello habria que lanzar una consulta adicional a la BD considerando los privilegios adicionales

  13. Nacho 27 December 2011 at 15:58 Permalink

    Buen tutorial,gracias por el aporte y sigue asi.

  14. lila 15 January 2012 at 17:12 Permalink

    <?php
    include (‘funciones.php’);

    if (verificar_usuario()){
    //aqui debe venir todo el contenido necesario que solo el usuario validado puede acceder
    print “Desconectarse aqui”;
    } else {
    header(‘Location:index.php’);
    }
    ?>

    cuando yo pongo esto en cada pagina por seguridad para que nadie entre me da este :Warning: session_start() [function.session-start]: Cannot send session cache limiter – headers already sent (output started at C:\AppServ\www\proenvio\step1.php:10) in

    como me pueden ayudar?

  15. neosergio 18 January 2012 at 14:09 Permalink

    Eso es porque la sesión ya fue iniciada en el archivo step1.php, debes revisar eso, para evitar conflictos de inicio de sesión

  16. Esteban 19 January 2012 at 13:53 Permalink

    Excelente el tutorial!

  17. lila 23 January 2012 at 17:34 Permalink

    gracias por la ayuda ya pude resolver el problema

  18. Horacio 23 January 2012 at 18:11 Permalink

    Profe una preguntita si es posible, como seria el post que para cuando se registre un nuevo usuario tenga que validar la cuenta por email. Muchas Gracias Horacio

  19. lila 24 January 2012 at 01:30 Permalink

    me podrias ayudar a saber como mantengo mi sesion abierta en todas mis paginas?

  20. berna 14 February 2012 at 23:44 Permalink

    Hola buen día, esta muy bien el tutorial pero como seria para ODBC tengo tiempo buscándolo pero no he podido encontrar nada, les agradecería mucho, soy novato en esto

    GRACIAS

  21. Antonio Ramos 26 February 2012 at 08:58 Permalink

    Hay alguna manera de modificar este codigo para hacer un nivel de acceso a diversas paginas por ejemplo el administrador tener privilegios de entrar a todas las paginas y los demas usuario solo puedan entrar un numero limitado de paginas, me imagino que se puede, podrian ayudarme con el codigo.

    gracias :)

  22. leidy 2 March 2012 at 23:46 Permalink

    profe disculpe tengo una consulta como podria hacer para que cuando ingrese ya sea el usuario o contraseña incorrecta x 3 veces ps me salga un anuncio o solo se cierre la pagina como podria hacer eso?

  23. Fmurdah 8 March 2012 at 14:47 Permalink

    Holla Holla …. yo tengo una pregunta, como puedo evitar que el usuario al salir de la secion se le de por ir “atras” a la pagina de acceso en el navegador y que este vuelva y cargue la informacion de loguea al darle “reenviar” ??

    No se si me hice entender bien.

  24. Armando 10 April 2012 at 00:47 Permalink

    Excelente ejemplo, sencillo y práctico, gracias.

  25. Galileo 30 April 2012 at 16:14 Permalink

    Yo tengo una duda, como o donde se le agregaria el codigo para que despues de un tiempo determinado digase 5min expire la sesion.

    Gracias, excelente ejemplo.

  26. paul 1 May 2012 at 19:25 Permalink

    nice

  27. Juan Carlos 2 May 2012 at 21:59 Permalink

    Excelente, muchas Gracias!


Leave a Reply

Notify me of followup comments via e-mail. You can also subscribe without commenting.