Vous êtes sur la page 1sur 22

15/6/2015 Autenticación de usuarios en PHP y MySql | Notas de Programación

Inicio
Contacto
Acerca de

Acerca de

Inicio
Java
PHP
Spring

Spring
PHP

Autenticación de usuarios en PHP y MySql


Publicado por
notaspro
el 19 octubre, 2014
Like 3 Twittear 1 2 1

Este tutorial es una replica de Autenticación de usuarios en PHP y MySql . Como decía anteriormente, en algunos sistemas a veces un
requerimiento es que se manejen privilegios y por lo tanto usuarios, esto con el fin de controlar lo que cada usuario puede hacer/ver una
vez dentro del sistema. En esta entrada únicamente se muestra como autenticar a los usuarios para entrar al sistema, es decir, cada
usuario tendrá los mismos privilegios; aunque la tabla de usuarios de MySql (que mostrare mas adelante) ya incluye un campo que
determina el tipo de usuario este campo no sera utilizado por ahora. Sin mas preámbulos muestro el ejemplo…

La base de datos

Como siempre que voy a hacer uso de una BD, empezare mostrando el script para recrear las tablas que usare en el ejemplo:

1 /*
2 www.notas-programacion.com
3 Descripcion:
4 Archivo con script para crear la bd y las tablas de este ejemplo.
5 Archivo: scripts_sql.sql
6 */
7 create database prueba;
8  
9 /*Crear Catalogo de tipos de usuario */
10 create table ctg_tiposusuario
11 (
12 id_TipoUsuario int not null auto_increment,
13 tx_TipoUsuario varchar(100),
14 primary key(id_TipoUsuario)
15 );
16  
17  
18 /* Catalogo de usuarios */
19 create table tbl_users(
20 id_usuario int not null auto_increment,
21 tx_nombre varchar(50) not null,
22 tx_apellidoPaterno varchar(50),
23 tx_apellidoMaterno varchar(50),
24 tx_correo varchar(100),
25 tx_username varchar(50),
26 tx_password varchar(250),
27 id_TipoUsuario int,
28 dt_registro datetime,
29 primary key(id_usuario),
30 foreign key(id_TipoUsuario) references ctg_TiposUsuario(id_TipoUsuario)
31 );
32  
33 /*Insertar tipos de usuarios de prueba*/
34 INSERT INTO `ctg_tiposusuario`( `tx_TipoUsuario`) VALUES ('Administrador');
35 INSERT INTO `ctg_tiposusuario`( `tx_TipoUsuario`) VALUES ('Usuario Normal');
36  
37 /*passwrd: 12345*/
38 /*Insertar usuario de prueba*/
39 INSERT INTO tbl_users (tx_Nombre,tx_apellidoPaterno,tx_apellidoMaterno,tx_correo,
40 tx_username,tx_password,id_TipoUsuario,dt_registro)
41 VALUES('Gonzalo','Silverio','Silverio','notaspro@notas-programacion.com',
42 'gonzasilve','827ccb0eea8a706c4c34a16891f84e7b',1,'2012-11-09 17:35:40');

La base de datos que usare se llama prueba. Como se observa únicamente son dos tablas, ademas, he creado un catalogo con los
diferentes tipos de usuario que pudiera haber, solo he añadido dos tipos de usuario (Administrador y Usuario normal) a modo de
ejemplo, pero se pueden añadir mas. Si observas, inserto un usuario de prueba. Si quieres asignar otro password al usuario de prueba
http://www.notas­programacion.com/2014/10/autenticacion­de­usuarios­en­php­y­mysql/ 1/22
15/6/2015 Autenticación de usuarios en PHP y MySql | Notas de Programación
puedes utilizar esta sencilla herramienta que te permite generar un Md5 a partir de una cadena cualquiera: obtener_md5.php

Supongo que para el momento de estar leyendo este articulo ya tienes el software necesario (ho al menos piensas instalarlo). Como he
visto que los visitantes muchas veces son estudiantes de carrera ho aficionados a la programación; pero con poca experiencia (me
incluyo), voy a listar las herramientas de software necesarias que debes tener yá en tu maquina si quieres probar este exquisito código :),
puedes usar otro servidor y otro DBMS, pero yo use estas:

Servidor apache (2 o sup. de preferencia)


PHP (5 o sup)
MySql (5 o sup.)
JQuery
Un servidor de correo, en este caso yo use hMailServer.

Como ves son pocos requisitos, si no tienes alguno este es el momento para que lo instales. El servidor de correo de hecho es opcional,
solo lo instale para hacer pruebas en mi computadora local (una laptop), si tienes dudas sobre hMailServer en la misma pagina viene
mucha documentación acerca de como instalarlo y configurarlo. Si tienes más dudas puedes preguntarle al oráculo (google) escribiendo
esto ‘hmailserver y php’.

Bueno vamos a lo interesante…

El código fuente

index.php
Este archivo permite mostrar la ventana de Login, es en esta como es de suponerse el usuario introduce su nombre de usuario, su
password y le da click al botón enviar, bueno muestro el código:

1 <!--    
2 www.notas-programacion.com
3 Descripcion:  
4 Archivo para mostrar una pantalla de login con los campos
5 de usuario y password, los 2 datos se envian al archivo validarUsuario.php
6 por el metodo POST.
7 Archivo:    index.php
8 -->
9 <html xmlns="http://www.w3.org/1999/xhtml">
10 <head>
11     <title>.:: Login ::. Ejemplo autenticar usuarios</title>
12     
13 <!--Importar hojas de estilo -->
14 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
15 <link href="css/estilos.css" rel="stylesheet" type="text/css">
16 <link href="css/jquery.alerts.css" rel="stylesheet" type="text/css" />
17  
18 <!--Importar scripts de javascript -->
19 <script src="js/jquery171.js" type="text/javascript"></script>
20 <script src="js/jquery.validate.js" type="text/javascript"></script>
21 <script src="js/jquery.alerts.js" type="text/javascript"></script>
22  
23  
24 <script type="text/javascript">
25 <!--
26 $(document).ready(function() {
27 $("#frmlogin").validate();
28 $("#usuario").focus();
29 });
30 // -->
31 </script>
32     
33 </head>
34 <body>
35 <br /><br />
36 <form id="frmlogin" name="frmlogin"  method="POST" action="validarUsuario.php">
37 <table align="center" width="200px">
38 <tr>
39     <td colspan="2" align="center"><h3>Iniciar sesi&oacute;n</h3></td>
40 </tr>
41 <tr>
42     <td>Usuario</td>
43     <td>
44         <input type="text" name="usuario" id="usuario" class="required" maxlength="50">
45     </td>
46 </tr>
47
48 <tr>
49     <td>Password</td>
50     <td>
51         <input type="password" name="password" id="password" class="required"  maxlength="50">
52     </td>
53 </tr>
54 <tr >
55     <td colspan="2" >
56         <a href="recuperarPassword.php">
57             Olvide mi contrase&ntilde;a
58         </a>
59     </td>
60 </tr>
61
62 <tr>
63     <td colspan="2" align="right">

http://www.notas­programacion.com/2014/10/autenticacion­de­usuarios­en­php­y­mysql/ 2/22
15/6/2015 Autenticación de usuarios en PHP y MySql | Notas de Programación
64         <input type="submit" name="enviar" value="Enviar" >
65     </td>
66
67 </tr>
68     
69 <tr>
70     <td colspan="2" align="right" >
71         <br/><a href="registro.php">Deseo registrarme</a>
72     </td>
73 </tr>
74     <?php
75     
76     //Mostrar errores de validacion de usuario, en caso de que lleguen
77     
78         if( isset( $_POST['msg_error'] ) )
79         {
80             switch( $_POST['msg_error'] )
81             {
82                 case 1:
83             ?>
84             <script type="text/javascript">
85                 jAlert("El usuario o password son incorrectos.", "Seguridad");
86                 $("#password").focus();
87             </script>
88             <?php
89                 break;        
90                 case 2:
91             ?>
92             <script type="text/javascript">
93                 jAlert("La seccion a la que intentaste entrar esta restringida.\n Solo permitida para usuarios registrados.", "Seguridad"
94             </script>
95             <?php      
96                 break;
97             }       //Fin switch
98         }
99
100         //Mostrar mensajes del estado del registro
101         
102         if( isset( $_POST['status_registro'] ) )
103         {
104             switch( $_POST['status_registro'] )
105             {
106                 case 1:
107                 if( $_POST['i_EmailEnviado'] ==1) {
108                 ?>
109                     <script type="text/javascript">
110                         jAlert("Gracias, ha sido registrado exitosamente.\n Se le ha enviado un correo electronico de bienvenida, \npor favor,
111                     </script>
112                     <?php
113                 } else {
114                     ?>
115                     <script type="text/javascript">
116                         jAlert("Gracias, ha sido registrado exitosamente.\n No se le ha podido enviar correo electronico de bienvenida, \nsin
117                     </script>
118                 <?php
119                 }
120
121                     break;        
122                 
123                 default:
124             ?>
125                 <script type="text/javascript">
126                     jAlert("Temporalmente NO se ha podido registrar, intente de nuevo mas tarde.", "Registro");
127                 </script>
128             <?php      
129             }       //Fin switch
130         }
131     ?>
132     
133 </table>
134 </form>
135 </body>
136 </html>

Como se puede ver para mostrar los mensajes de error utilizo la librería JQuery, ya que me pareció que usar un alert() de javascript es
algo feito, jajajaj. Como se ve el archivo en si solamente crea un formulario en el cual se dibujan dos cajas de texto; una para el usuario y
otra para el password, un link para ir a la pantalla de recuperación del password en caso de que al usuario se le haya olvidado y por
ultimo se crea un botón tipo submit para enviar la información. Para validar campos vacíos también utilizo JQuery. Ademas se puede ver
que envió los dos datos de las cajitas a un archivo llamado validarUsuario.php por el método POST; el cual se encargara de acceder a la
BD y verificar que los datos sean correctos.

Otra cosa interesante que se puede observar es que este archivo verifica si le llega un parámetro llamado msg_error (con la función
isset() de php) y en base a ese parámetro (en realidad es un código de error) muestra un mensaje de error. A continuación muestro un
pantallazo como se ve el formulario en el navegador Chrome:

http://www.notas­programacion.com/2014/10/autenticacion­de­usuarios­en­php­y­mysql/ 3/22
15/6/2015 Autenticación de usuarios en PHP y MySql | Notas de Programación

Y en caso de que el usuario introduzca un nombre de usuario incorrecto se mostrara esta pantalla:

Como se observa se ven mas atractivas las alertas con JQuery y ademas es sumamente fácil utilizarlas.

validarUsuario.php
Este archivo es el que se encarga de recibir los datos del archivo index.php y los compara contra los que están en la BD. Si el usuario y el
password son correctos (existen en la BD) guarda el id del usuario en un formulario (el dato se envía oculto, hidden), inicializa una sesión ,
guarda algunas variables en dicha sesión y redirecciona hacia el archivo principal.php el cual es la pagina web que se supone debe
mostrarse para usuarios registrados. En caso de que el usuario y/o password sean incorrectos entonces este archivo guarda igualmente
un codigo de error en un formulario y redirecciona a la pagina de login, es decir, al archivo index.php.

A continuación se muestra su código fuente:

1 <?php
2 /*
3 www.notas-programacion.com
4 Descripcion:
5 Archivo que recibe los valores de 2 campos;
6 un usuario y un password, los 2 datos se buscan si estan en la
7 base de datos y redicciona al login o la pagina principal.
8 Archivo:    validarUsuario.php
9 */
10
11     //conectar BD
12     include("conectar_bd.php");
13     conectar_bd();
14     
15     $usr = $_POST['usuario'];
16     $pw = $_POST['password'];
17     //Obtengo la version encriptada del password

http://www.notas­programacion.com/2014/10/autenticacion­de­usuarios­en­php­y­mysql/ 4/22
15/6/2015 Autenticación de usuarios en PHP y MySql | Notas de Programación
18     $pw_enc = md5($pw);
19     
20     $sql = "SELECT id_usuario FROM tbl_users
21             INNER JOIN ctg_tiposusuario
22             ON tbl_users.id_TipoUsuario = ctg_tiposusuario.id_TipoUsuario
23             WHERE tx_username = '".$usr."'
24             AND tx_password = '".$pw_enc."' ";
25     $result     =mysql_query($sql,$conexio);
26
27     $uid = "";
28     
29     //Si existe al menos una fila
30     if( $fila=mysql_fetch_array($result) )
31     {      
32         //Obtener el Id del usuario en la BD      
33         $uid = $fila['id_usuario'];
34         //Iniciar una sesion de PHP
35         session_start();
36         //Crear una variable para indicar que se ha autenticado
37         $_SESSION['autenticado']    = 'SI';
38         //Crear una variable para guardar el ID del usuario para tenerlo siempre disponible
39         $_SESSION['uid']            = $uid;
40         //CODIGO DE SESION
41         
42         //Crear un formulario para redireccionar al usuario y enviar oculto su Id
43 ?>
44         <form name="formulario" method="post" action="principal.php">
45             <input type="hidden" name="idUsr" value='<?php echo $uid ?>' />
46         </form>
47 <?php
48     }
49     else {
50         //En caso de que no exista una fila...
51         //..Crear un formulario para redireccionar al usuario a la pagina de login
52         //enviandole un codigo de error
53 ?>
54         <form name="formulario" method="post" action="index.php">
55             <input type="hidden" name="msg_error" value="1">
56         </form>
57 <?php
58     }
59 ?>
60                     
61 <script type="text/javascript">
62     //Redireccionar con el formulario creado
63     document.formulario.submit();
64 </script>

Como se observa; la mayoría del código esta comentado por lo que me ahorrare volver a explicar: Lo que si quiero mencionar es que en
la linea 40 he dejado un comentario (CÓDIGO DE SESIÓN), en esa linea si usted quiere puede generar un identificador de sesión, debido a
que el ID de sesión de PHP a veces se pierde; usted puede crear un ID mas seguro; por ejemplo con base a la fecha y hora actual. la
función session_id() permite leer o asignar el ID de la sesión.

La función session_start() permite iniciar una sesión o continuar una ya iniciada. Es por eso que en todas las paginas web que requieran
que el usuario este autenticado se llama a esta función de PHP, esto lo podrás ver en los demás archivos que mostrare mas adelante.

En la linea 37 a 39 se observa que es muy fácil crear una variable de sesión con ayuda del array global $_SESSION[], basta con agregar un
nuevo ítem y asignarle un valor, así de fácil. Posteriormente se pueden utilizar en cualquier pagina php por ejemplo para mostrar el Id del
usuario y su Status en el navegador:

1 echo "Id del usuario:".$_SESSION['uid'];


2 echo "Ha iniciado sesion:".$_SESSION['autenticado'];

Facil ¿No?. Continuemos…

En la linea 12 del archivo validarUsuario.php se inserta un archivo llamado conectar_bd.php el cual se encarga de conectar con el
DBMS, este archivo es el que muestro a continuacion…

conectar_bd.php

1 <?php
2 /*    
3 www.notas-programacion.com
4 Descripción:  
5 Conecta con el Manejador de Base de Datos (DBMS) y deja disponible una variable global (conexio)
6 para ser utilizada posteriormente.
7 Archivo:    conectar_bd.php
8 */
9
10 $conexio;
11 function conectar_bd()
12 {
13     global $conexio;
14     //Definir datos de conexion con el servidor MySQL
15     $elUsr = "root";
16     $elPw  = "12345";
17     $elServer ="localhost";
18     $laBd = "prueba";
19     
20     //Conectar
21     $conexio = mysql_connect($elServer, $elUsr , $elPw) or die (mysql_error());

http://www.notas­programacion.com/2014/10/autenticacion­de­usuarios­en­php­y­mysql/ 5/22
15/6/2015 Autenticación de usuarios en PHP y MySql | Notas de Programación
22     
23     //Seleccionar la BD a utilizar
24     mysql_select_db($laBd, $conexio ) or die (mysql_error());
25 }  
26 ?>

Como se observa primero se definen los datos de conexión en variables locales a la función conectar_bd(). y posteriormente estas
variables se usan como parámetros para llamar a la función mysql_connect(), la cual es la que hace la petición al DBMS para conectarse.
La función mysql_connect() devuelve un link que representa la conexión establecida al dbms, con este link guardado en la variable
$conexio se selecciona la BD a utilizar (linea 24).

principal.php
Este archivo es la pantalla que el usuario ve si se logueo correctamente, nada mas como ejemplo he creado una muy sencilla. Cuando el
usuario accede a esta pagina web se supone que ya paso por la pantalla de login y sus datos fueron verificados en la BD. Pero por
seguridad antes de mostrarla verifico que efectivamente este logueado a través de las variables de sesión que fueron creadas en el
archivo validarUsuario.php.

A continuación muestro el código fuente:

1 <?php
2 /*    
3 www.notas-programacion.com
4 Descripcion:  
5 Pantalla inicial que se muestra al usuario una vez que ha
6 sido logueado correctamente.
7 Archivo:    principal.php
8 */
9  
10 //Inicializar una sesion de PHP
11 session_start();
12
13 //Validar que el usuario este logueado y exista un UID
14 if ( ! ($_SESSION['autenticado'] == 'SI' && isset($_SESSION['uid'])) )
15 {
16     //En caso de que el usuario no este autenticado, crear un formulario y redireccionar a la
17     //pantalla de login, enviando un codigo de error
18 ?>
19         <form name="formulario" method="post" action="index.php">
20             <input type="hidden" name="msg_error" value="2">
21         </form>
22         <script type="text/javascript">
23             document.formulario.submit();
24         </script>
25 <?php
26 }
27
28     //Conectar BD
29     include("conectar_bd.php");
30     conectar_bd();
31
32     //Sacar datos del usuario que ha iniciado sesion
33     $sql = "SELECT  tx_nombre,tx_apellidoPaterno,tx_TipoUsuario,id_usuario
34             FROM tbl_users
35             LEFT JOIN ctg_tiposusuario
36             ON tbl_users.id_TipoUsuario = ctg_tiposusuario.id_TipoUsuario
37             WHERE id_usuario = '".$_SESSION['uid']."'";        
38     $result     =mysql_query($sql);
39
40     $nombreUsuario = "";
41
42     //Formar el nombre completo del usuario
43     if( $fila = mysql_fetch_array($result) )
44         $nombreUsuario = $fila['tx_nombre']." ".$fila['tx_apellidoPaterno'];
45     
46 //Cerrrar conexion a la BD
47 mysql_close($conexio);
48 ?>
49 <html xmlns="http://www.w3.org/1999/xhtml">
50 <head>
51     <title>.:: Inicio ::. Ejemplo autenticar usuarios</title>
52 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
53 <!--Importar hojas de estilo -->
54 <link href="css/estilos.css" rel="stylesheet" type="text/css">
55  
56 </head>
57 <body topmargin="0" >
58 <table align="right" width="350px" border="0">
59 <tr>                                              <!-- Dar Bienvenida al usuario -->
60     <td  width="100px" align="right">Bienvenido <b><?php echo $nombreUsuario ?></b></td>
61     <td  width="15px" align="center">
62         <!-- Proporcionar Link para cerrar sesion -->
63         <a href="cerrarSesion.php">Cerrar sesi&oacute;n</a>
64     </td>
65 </tr>
66 </table>
67 <br /><br />
68 <h2 align="center">Pantalla Principal</h2>
69
70         <!-- Contenido inicial del sitio web -->
71         
72 <body>
73 </html>

http://www.notas­programacion.com/2014/10/autenticacion­de­usuarios­en­php­y­mysql/ 6/22
15/6/2015 Autenticación de usuarios en PHP y MySql | Notas de Programación
Como decía en la lineas anteriores, cuando una pagina esta restringida lo primero que se debe hacer es verificar que el usuario esta
logueado y tiene permisos para ver dicha pagina. Como dije que no mostraría como dar permisos a los usuarios, en este ejemplo solo se
comprueba que haya una sesión iniciada y que exista entre las variables de sesión un UID (User Id); Id del usuario en la Base de datos.

Si se verifica que esas condiciones se cumplen entonces se obtienen los datos del usuario, tal como su nombre , correo electrónico, etc.
Yo solo saque su nombre completo y lo mostré en la esquina superior derecha para que el usuario tenga la sensación que a entrado al
portal. A continuación muestro un pantallazo de este archivo en el navegador:

Como se observa también se ha puesto al usuario un link para que cierre su sesión.

Seguridad

Imaginemos que un usuario malintencionado escribe directamente la URL de este archivo en su navegador (escribe
http://localhost/autenticar_usuarios/principal.php) pensando que con esto puede entrar y ver el contenido del sitio. Perderá su
tiempo pues para eso precisamente se hace la validación al inicio y solamente vera un mensaje de error como el que se ve a continuación:

cerrarSesion.php
Este archivo es al que apunta el enlace “Cerrar sesión ” que esta a un lado del nombre de usuario (una vez que ha iniciado su sesión).
Este archivo se encarga de destruir todas las variables de sesión y terminar la sesión; todo esto se hace con las funciones que PHP ya trae
incluidas.

1 <?php
2 /*    
3 www.notas-programacion.com
4 Descripcion:  
5 Archivo para destruir las variables de sesion de un usuario logueado y terminar la sesion,

http://www.notas­programacion.com/2014/10/autenticacion­de­usuarios­en­php­y­mysql/ 7/22
15/6/2015 Autenticación de usuarios en PHP y MySql | Notas de Programación
6 ademas redirecciona nuevamente a la pagina de login.
7 Archivo:    cerrarSesion.php
8 */
9 session_start();
10 // Destruye todas las variables de la sesion
11 session_unset();
12 // Finalmente, destruye la sesion
13 session_destroy();
14
15 //Redireccionar a la pagina de login
16 header ("Location: index.php");
17
18 ?>

Como se ve es muy corto el archivo. No doy mas explicacion ya que cada instruccion esta comentada.

recuperarPassword.php
En la pagina de login, si observas hay un link que dice Olvide mi contraseña, este link nos manda al archivo recuperarPassword.php.
Este archivo permite enviar un nuevo password al usuario, el usuario solo debe escribir su correo electrónico y automáticamente se
generara un nuevo password de nueve caracteres y se le enviara a dicho email. Obviamente que el correo proporcionado se valida que
exista en la BD; Como se observa en la BD el password esta cifrado en MD5 por lo que es necesario proporcionarle otro; no hay forma
descifrar el password anterior.

1 <!--
2 www.notas-programacion.com
3 Descripcion:  
4 Pantalla para recuperar el password del usuario en caso de extravio.
5 Archivo:    recuperarPassword.php
6 -->
7 <!DOCTYPE html>
8 <html xmlns="http://www.w3.org/1999/xhtml">
9 <head>
10 <title>.:: Recuperar Password ::. </title>
11 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
12 <!--Importar hojas de estilo -->
13 <link href="css/estilos.css" rel="stylesheet" type="text/css">
14 <link href="css/jquery.alerts.css" rel="stylesheet" type="text/css" />
15  
16 <!--Importar scripts de javascript -->
17 <script src="js/jquery171.js" type="text/javascript"></script>
18 <script src="js/jquery.validate.js" type="text/javascript"></script>
19 <script src="jsjquery.alerts.js" type="text/javascript"></script>
20
21 <script type="text/javascript">
22 <!--
23 $(document).ready(function() {
24 $("#recPassword").validate({
25 rules: {
26 /*A continuacion los nombres de los campos y sus reglas a cumplir */
27 correo2: {
28 required: true,
29 email: true,
30 equalTo: "#correo"
31 },
32 correo: {
33 required: true,
34 email: true
35 }
36  
37  
38 }
39 });
40 });
41 // -->
42 </script>
43
44 </head>
45 <body>
46 <br /><br />
47  
48  
49 <form id="recPassword" name="recPassword"  method="POST" action="recuperarPassword.php">
50  
51 <table align="center" width="50%">
52  
53 <tr>
54 <td colspan="2" align="center"><h3><b>Recuperar Password</b></h3></td>
55 </tr>
56  
57 <?php
58 if( isset( $_POST['correo'] ) && $_POST['correo'] != '' )
59 {
60  
61 include("conectar_bd.php");  
62 conectar_bd();
63 include("generar_token.php");  
64  
65 $elcorreo   = $_POST['correo'];
66
67 //Verificar si existe el correo en la BD
68 $sql = "SELECT  id_usuario,tx_username,tx_nombre,tx_apellidoPaterno
69 FROM tbl_users
70 WHERE tx_correo = '".$elcorreo."'";
71 $rs_sql = mysql_query($sql);

http://www.notas­programacion.com/2014/10/autenticacion­de­usuarios­en­php­y­mysql/ 8/22
15/6/2015 Autenticación de usuarios en PHP y MySql | Notas de Programación
72  
73 if ( !( $fila = mysql_fetch_object($rs_sql) )  )
74 {
75 ?>
76 <input type="hidden" id="error" value="1">
77 <script type="text/javascript">
78 location.href="recuperarPassword.php?error="+document.getElementById('error').value;
79 </script>
80 <?php
81 }
82
83 $idusr = $fila->id_usuario;
84 $nombre = $fila->tx_nombre." ".$fila->tx_apellidoPaterno;
85 $nick = $fila->tx_username;
86
87 // Generacion de una nueva contraseña
88 $pasw = obtenToken(8);
89
90 // Envio al usuario su nuevo password
91      $seEnvio; //Para determinar si se envio o no el correo
92      $destinatario = $elcorreo; //A quien se envia
93      $nomAdmin = 'Gonzalo Silverio'; //Quien envia
94 $mailAdmin = 'notaspro@notas-programacion.com'; //Nombre de quien envia
95 $urlAccessLogin = 'http://localhost/autenticar_usuarios/'; //Nombre de quien envia
96 // $mailAdmin = 'gonzasilve@localhost'; //Nombre de quien envia
97      $elmensaje = "";    
98      $asunto = "Nueva contraseña para ".$nick;
99  
100      $cuerpomsg ='
101 <h3>.::Recuperar Password::.</h3>
102 <p>A peticion de usted; se le ha asignado un nuevo password, utilice los siguientes datos para acceder al sistema</p>
103   <table border="0" >
104 <tr>
105   <td colspan="2" align="center" ><br> Nuevos datos de acceso para <a href="'.$urlAccessLogin.'">'.$urlAccessLogin.'</a><br></td>
106 </tr>
107 <tr>
108   <td> Nombre </td>
109   <td> '.$nombre.' </td>
110 </tr>
111 <tr>
112   <td> Username </td>
113   <td> '.$nick.' </td>
114 </tr>
115 <tr>
116   <td> Password </td>
117   <td> '.$pasw.' </td>
118 </tr>
119   </table> ';
120   
121 date_default_timezone_set('America/Mexico_City');
122   
123 //Establecer cabeceras para la funcion mail()
124 //version MIME
125 $cabeceras = "MIME-Version: 1.0\r\n";
126 //Tipo de info
127 $cabeceras .= "Content-type: text/html; charset=iso-8859-1\r\n";
128 //direccion del remitente
129 $cabeceras .= "From: ".$nomAdmin." <".$mailAdmin.">";
130 $resEnvio = 0;
131 if(mail($destinatario,$asunto,$cuerpomsg,$cabeceras))
132 {
133 //Actualizar pwd en la BD
134 $sql_updt = "UPDATE tbl_users SET tx_password = '".md5($pasw)."'
135 WHERE (id_usuario = ".$idusr.")
136 AND (tx_correo = '".$elcorreo."')";
137 $res_updt = mysql_query($sql_updt);
138 $resEnvio = 1;
139 }
140
141 // Mostrar resultado de envio
142 ?>
143 <input type="hidden" id="enviado" value="<?php echo $resEnvio ?>">
144 <input type="hidden" id="elcorreo" value="<?php echo $elcorreo ?>">
145 <script type="text/javascript">
146 location.href="recuperarPassword.php?enviado="+document.getElementById('enviado').value+"&elcorreo="+document.getElementById
147 </script>
148 <?php
149
150 }
151 else
152 {
153 ?>
154  
155  
156 <tr>
157 <td colspan="2">Escriba su Correo electronico con el que se ha registrado,
158 se le enviara un nuevo password a su correo electronico:<br /><br />
159 </td>
160 </tr>
161  
162 <tr>
163 <td>Correo electronico:</td>
164 <td>
165 <input type="text" name="correo" id="correo"  maxlength="50" />
166 </td>
167 </tr>
168 <tr>
169 <td>Confirme Correo electronico:</td>

http://www.notas­programacion.com/2014/10/autenticacion­de­usuarios­en­php­y­mysql/ 9/22
15/6/2015 Autenticación de usuarios en PHP y MySql | Notas de Programación
170 <td>
171 <input type="text" name="correo2" id="correo2" maxlength="50" />
172 </td>
173 </tr>
174  
175 <?php
176 if( isset($_GET['error']) && $_GET['error']==1 )
177 {
178 echo "<tr><td colspan='2'><br><font color='red'>El correo electronico no pertenece a ningun usuario registrado.</font><br></td></tr>"
179 }
180 else if( isset($_GET['enviado']) && isset($_GET['elcorreo'])  )
181 {
182 if( $_GET['enviado']==1 )
183 echo "<tr><td colspan='2'><br><font color='green'>Su nueva contrase&ntilde;a ha sido enviada a <strong>".$_GET['elcorreo'
184 else if( $_GET['enviado']==0 )
185 echo "<tr><td colspan='2'><br><font color='red'>Por el momento la nueva contrase&ntilde;a no pudo ser enviada a <strong>"
186 Intente de nuevo mas tarde.</font></td></tr>";
187 }
188 ?>
189  
190 <tr>
191 <td colspan="2" align="center">
192 <br /><br />
193 <input type="submit" name="enviar" value="Enviar" >
194 &nbsp;&nbsp;&nbsp;&nbsp;
195 <input type="button" onClick="javascript: location.href='index.php'" name="cancelar" value="Cancelar" >        
196 </td>
197 </tr>
198  
199 <?php
200 }
201 ?>
202  
203 </table>
204 </form>
205 </body>
206 </html>

Primero que nada una imagen de la pantalla que se muestra al abrir el archivo recuperarPassword.php:

Para mas seguridad el password nunca se muestra al usuario, por el contrario; se le asigna otro (formado aleatoriamente) y se le envía
por correo electrónico. Como se observa en la linea 58 se comienza comprobando si llega un parámetro llamado ‘correo’; si llega esto
quiere decir que el formulario de recuperación de password ya fue enviado y el correo que esta llegando es de un usuario al que se le
debe asignar un nuevo password. Por el contrario; sino llega, se dibujan dos cajas de texto para permitir al usuario escribir su correo
electrónico y se le pueda enviar su password.

Bueno, supongamos que a este archivo le llega el parámetro correo, entonces de la linea 65 a la linea 81 se comprueba si ese email
existe en la BD. Si no existe, entonces se redirecciona al usuario a este mismo archivo pero con un código de error, el cual servirá para
mostrar un texto al usuario avisando que su correo electrónico no existe. En caso de que si exista el email en la BD (no se cumple la
condición de la linea 73) entonces se recuperan los datos del usuario (linea 83 a la 85) y posteriormente se le genera un nuevo password
(linea 88 ), observe la forma como he generado el nuevo password; se manda a llamar a la función obtenToken($longitud) que esta
definida en el archivo generar_token.php del cual hablare mas adelante.

Y ya por ultimo se le envía el password a su correo electrónico del usuario (linea 90 a la linea 139). Algo que me gustaría resaltar es que el
nuevo password debe ser actualizado en la BD para que la próxima vez el usuario intente iniciar sesión pues este password sea valido,
ademas, solo se debe de actualizar después de notificar al usuario (envió de email correcto), tal como se hace en este ejemplo.

A continuación pongo una imagen del error que aparece en caso de que el email escrito no exista:

http://www.notas­programacion.com/2014/10/autenticacion­de­usuarios­en­php­y­mysql/ 10/22
15/6/2015 Autenticación de usuarios en PHP y MySql | Notas de Programación

Mensaje en caso de que el email haya sido enviado correctamente:

Ya no pongo el mensaje del error en caso de que NO se envié el email (falle la función mail() de php), porque es muy obvia, pero, a
continuación dejo una imagen del Email que le llega al usuario, con sus nuevos datos de acceso:

En la linea 63 del archivo recuperarPassword.php se inserta el archivo generar_token.php el cual contiene algunas funciones para
generar tokens de seguridad. Este mismo archivo lo explique en un articulo previo a este, te recomiendo leer el articulo para comprender
su funcionamiento. A continuación pongo el código fuente de este archivo:

http://www.notas­programacion.com/2014/10/autenticacion­de­usuarios­en­php­y­mysql/ 11/22
15/6/2015 Autenticación de usuarios en PHP y MySql | Notas de Programación
generar_token.php

1 <?php
2 /*    
3 www.notas-programacion.com
4 Descripción:  
5 Ejemplos de generacion de tokens se seguridad.
6 Archivo:    generar_token.php
7 */
8  
9 function obtenCaracterAleatorio($arreglo) {
10 $clave_aleatoria = array_rand($arreglo, 1); //obten clave aleatoria
11 return $arreglo[ $clave_aleatoria ]; //devolver item aleatorio
12 }
13  
14 function obtenCaracterMd5($car) {
15 $md5Car = md5($car.Time()); //Codificar el caracter y el tiempo POSIX (timestamp) en md5
16 $arrCar = str_split(strtoupper($md5Car)); //Convertir a array el md5
17 $carToken = obtenCaracterAleatorio($arrCar); //obten un item aleatoriamente
18 return $carToken;
19 }
20  
21 function obtenToken($longitud) {
22 //crear alfabeto
23 $mayus = "ABCDEFGHIJKMNPQRSTUVWXYZ";
24 $mayusculas = str_split($mayus); //Convertir a array
25 //crear array de numeros 0-9
26 $numeros = range(0,9);
27 //revolver arrays
28 shuffle($mayusculas);
29 shuffle($numeros);
30 //Unir arrays
31 $arregloTotal = array_merge($mayusculas,$numeros);
32 $newToken = "";
33
34 for($i=0;$i<=$longitud;$i++) {
35 $miCar = obtenCaracterAleatorio($arregloTotal);
36 $newToken .= obtenCaracterMd5($miCar);
37 }
38 return $newToken;
39 }
40  
41 ?>

Registro de usuarios

A petición de muchos de los visitantes que preguntan (ya sea en privado o en comentarios de esta entrada) como registrar usuarios en
php decidí exponer un ejemplo. En la pantalla de Login si observas aparece un enlace (hipervinculo) con la leyenda Deseo registrarme;
el código que muestro a continuación es del archivo que se muestra en el navegador al dar click en dicho enlace. Este archivo, en
resumen, muestra un formulario creado con HTML para que el usuario capture sus datos personales y datos de acceso (username y
password) envié dichos datos al script guardarRegistro.php que guarda los datos en la base de datos. El codigo es este…

registro.php

1 <?php
2 /*
3      www.notas-programacion.com
4     Descripción:  
5 Este archivo muestra un formulario que permite al usuario
6 capturar sus datos y personales y de acceso.
7     Archivo:    registro.php
8 */
9  
10 $str_nombre         = "";
11 $str_apPaterno  = "";
12 $str_apMaterno  = "";
13 $str_correo         = "";
14 $str_username   = "";
15 $str_password   = "";
16 $str_password2  = "";
17
18 if( isset($_POST['str_nombre']) )      
19     $str_nombre         = trim($_POST['str_nombre']);
20 if( isset($_POST['str_apPaterno']) )
21     $str_apPaterno  = trim($_POST['str_apPaterno']);
22 if( isset($_POST['str_apMaterno']) )
23     $str_apMaterno      = trim($_POST['str_apMaterno']);
24 if( isset($_POST['str_correo']) )
25     $str_correo     = trim($_POST['str_correo']);
26 if( isset($_POST['str_username']) )
27     $str_username   = trim($_POST['str_username']);
28 if( isset($_POST['str_password']) )
29     $str_password   = trim($_POST['str_password']);
30 if( isset($_POST['str_password2']) )
31     $str_password2  = trim($_POST['str_password2']);
32
33
34 ?>
35 <!DOCTYPE html>
36 <html xmlns="http://www.w3.org/1999/xhtml">
37 <head>

http://www.notas­programacion.com/2014/10/autenticacion­de­usuarios­en­php­y­mysql/ 12/22
15/6/2015 Autenticación de usuarios en PHP y MySql | Notas de Programación
38   <title>.:: Registrar Usuario ::. </title>
39
40 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
41 <!--Importar hojas de estilo -->
42 <link href="css/estilos.css" rel="stylesheet" type="text/css">
43 <link href="css/jquery.alerts.css" rel="stylesheet" type="text/css" />
44  
45 <!--Importar scripts de javascript -->
46 <script src="js/jquery171.js" type="text/javascript"></script>
47 <script src="js/jquery.validate.js" type="text/javascript"></script>
48 <script src="jsjquery.alerts.js" type="text/javascript"></script>
49  
50     <script type="text/javascript">
51     <!--
52         $().ready(function() {
53         $("#registrar_usuario").validate({
54         rules: {
55         /*A continuacion los nombres de los campos y sus reglas a cumplir */
56             tx_nombre: {
57                 required: true, minlength: 3
58             },
59             tx_apPaterno: {
60                 required: true, minlength: 3
61             },
62             tx_apMaterno: {
63                 required: true, minlength: 3
64             },
65             tx_correo: {
66                 required: true, minlength: 5, email: true
67             },
68             tx_username: {
69                 required: true, minlength: 5
70             },
71             tx_password: {
72                 required: true, minlength: 5
73             },
74             tx_password2: {
75                 required: true, minlength: 5,   equalTo: "#tx_password"
76             }
77
78         },
79         /*A continuacion los campos y los mensajes en caso de que no se cumplan las reglas */
80         messages: {
81             tx_nombre: {
82                 required: "Por favor, escriba su Nombre.",
83                 minlength: jQuery.format("Su Nombre como minimo debe tener {0} caracteres.")
84             },
85             tx_apPaterno: {
86                 required: "Por favor, escriba su Apellido Paterno.",
87                 minlength: jQuery.format("Su Apellido Paterno como minimo debe tener {0} caracteres.")
88             },
89             tx_apMaterno: {
90                 required: "Por favor, escriba su Apellido Materno.",
91                 minlength: jQuery.format("Su Apellido Materno como minimo debe tener {0} caracteres.")
92             },
93             tx_correo: {
94                 required: "Por favor, escriba una direccion de correo electronico valida.",
95                 minlength: jQuery.format("Por favor, escriba una direccion de correo electronico valida.")
96             },
97             tx_username: {
98                 required: "Por favor, escriba un nombre de usuario. Este dato le servira para iniciar sesion y ver el contenido.",
99                 minlength: jQuery.format("Su nombre de usuario como minimo debe tener {0} caracteres.")
100             },
101             tx_password: {
102                 required: "Por favor, escriba una contraseña.",
103                 minlength: jQuery.format("Su contraseña como minimo debe tener {0} caracteres.")
104             },
105             tx_password2: {
106                 required: "Por favor, repita la contraseña anterior.",
107                 minlength: jQuery.format("Su contraseña como minimo debe tener {0} caracteres."),
108                 equalTo: "Por favor, repita la contraseña anterior.",
109             }
110
111         }
112
113         });
114         $("#tx_nombre").focus();
115         });
116     // -->
117     </script>
118
119 </head>
120 <body>
121 <br />
122
123
124 <form id="registrar_usuario" name="registrar_usuario"  method="POST" action="guardarRegistro.php">
125
126 <table align="center" width="600px">
127
128 <tr>
129     <td colspan="2" align="center"><h3><b>Registrar usuario</b></h3></td>
130 </tr>
131
132 <tr>
133     <td colspan="2">Gracias por tu interés en registrarte. Para hacerlo, solo debes llenar
134     los siguientes campos y pulsar el botón <b>Registrarme</b>. Para hacer mas rápido el registro y
135     así tu puedas acceder al contenido, tu cuenta se activa inmediatamente.<br><br>

http://www.notas­programacion.com/2014/10/autenticacion­de­usuarios­en­php­y­mysql/ 13/22
15/6/2015 Autenticación de usuarios en PHP y MySql | Notas de Programación
136     </td>
137 </tr>
138     
139     <?php
140         //Si llega el parametro error y no viene vacio
141         if( isset( $_POST['error'] ) && $_POST['error'] != '' ) {
142     ?>
143         <tr>
144             <td colspan="2" >
145                 <font color="red">
146                 <ul>
147                     <?php
148                         echo $_POST['msgs_error'];
149                     ?>
150                 </ul>
151                 </font>
152             </td>
153         </tr>
154     <?php
155         }
156     ?>
157
158     
159     <tr>
160         <td><label for="tx_nombre">Nombre(s)</label></td>
161         <td>
162             <input type="text" name="tx_nombre" id="tx_nombre" value='<?php echo $str_nombre ?>' size="30"  maxlength="30" />
163         </td>
164     </tr>
165     <tr>
166         <td><label for="tx_apPaterno">Apellido paterno</label></td>
167         <td>
168             <input type="text" name="tx_apPaterno" id="tx_apPaterno" value='<?php echo $str_apPaterno ?>' size="30"  maxlength="30" /
169         </td>
170     </tr>
171     <tr>
172         <td><label for="tx_apMaterno">Apellido materno</label></td>
173         <td>
174             <input type="text" name="tx_apMaterno" id="tx_apMaterno"  value='<?php echo $str_apMaterno ?>' size="30"  maxlength="30"
175         </td>
176     </tr>
177     <tr>
178         <td><label for="tx_correo">Correo electronico</label></td>
179         <td>
180             <input type="text" name="tx_correo" id="tx_correo"  value='<?php echo $str_correo ?>' size="30"  maxlength="30" />
181         </td>
182     </tr>
183     <tr>
184         <td><label for="tx_username">Nombre de usuario</label></td>
185         <td>
186             <input type="text" name="tx_username" id="tx_username"  value='<?php echo $str_username ?>' size="25"  maxlength="25"  />
187         </td>
188     </tr>
189     <tr>
190         <td><label for="tx_password">Contrase&ntilde;a</label></td>
191         <td>
192             <input type="password" name="tx_password" id="tx_password"  value='<?php echo $str_password ?>'  size="25"  maxlength="25"
193         </td>
194     </tr>
195     <tr>
196         <td><label for="tx_password2">Confirme la contrase&ntilde;a</label></td>
197         <td>
198             <input type="password" name="tx_password2" id="tx_password2"  value='<?php echo $str_password2 ?>'  size="25"  maxlength=
199         </td>
200     </tr>
201     <tr>
202         <td>Tipo de usuario</td>
203         <td>
204             <input type="hidden" name="i_tipoUsuario" id="i_tipoUsuario" value="2"   />
205             <input type="radio" name="rad_TipoUsuario" id="rad_TipoUsuario" disabled value="2" checked="checked"  /> Usuario normal &
206             <input type="radio" name="rad_TipoUsuario" id="rad_TipoUsuario" disabled value="1"  /> Administrador
207         </td>
208     </tr>
209
210 <tr>
211
212     <td align="center" colspan="2">
213         <br /><br />
214         <input type="submit" name="registrarme" value="Registrarme" >
215 &nbsp;&nbsp;&nbsp;&nbsp;
216         <input type="button" onClick="javascript: location.href='index.php'" name="cancelar" value="Cancelar" >
217     </td>
218 </tr>
219
220 </table>
221 </form>
222 </body>
223 </html>

Como puedes observar esta un poco extenso (como 200 lineas sin lineas en blanco); ese es el precio de validar de una manera rigurosa
los datos que el usuario introduce en los cuadros de texto. Tratare de explicar un poco este archivo, pero antes te muestro una imagen de
la pagina web que se genera a partir del código fuente anterior:

http://www.notas­programacion.com/2014/10/autenticacion­de­usuarios­en­php­y­mysql/ 14/22
15/6/2015 Autenticación de usuarios en PHP y MySql | Notas de Programación

De la linea 10 a 16 se declaran y limpian variables, una para cada dato del usuario que se va a registrar, enseguida en la linea 18 se
verifica si esta llegando (si existe, con isset()) la variable de str_nombre, si se cumple que si existe dicha variable; hay una variable con el
mismo nombre que se declaro antes (linea 10), entonces se le asigna el valor que llega. Cuando llegan datos significa que ya se habían
enviado los datos al archivo guardarRegistro.php y éste los esta regresando si no los pudo guardar. Esta operación la realiza para cada
dato del usuario.

Si continuamos viendo el código se observa que de la linea 50 a la 117 es codigo javascript donde ajustamos parámetros del plugin de
validación de JQuery. A este tipo de validación se le conoce como validación del lado cliente, en este caso el cliente es el navegador.

En la linea 124 se observa que esta escrito el encabezado del formulario y en su parametro action estamos diciendole que envie los datos
de dicho formulario al archivo guardarRegistro.php el cual se encargara de guardarlos en la base de datos (no sin antes validarlos en el
lado servidor).

En la linea 141 estamos verificando si existe/llega una variable llamada error y en caso de que si, mostramos la lista de errores que
ocurrieron al guardar. La lista de errores vienen en otra variables llamada msg_error. Observa como en la linea 146 y 150 se abre y cierra,
respectivamente una lista desordenada de HTML, la variable msg_error trae los <li> </li> correspondientes, cada <li> es un error que
ocurrió al intentar guardar en el archivo guardarRegistro.php. En caso de que hayan ocurrido errores se mostrara una pantalla similar a
esta:

http://www.notas­programacion.com/2014/10/autenticacion­de­usuarios­en­php­y­mysql/ 15/22
15/6/2015 Autenticación de usuarios en PHP y MySql | Notas de Programación

guardarRegistro.php

Este archivo recibe los datos del archivo registro.php y los guarda en la base de datos. Antes de guardar realiza varias validaciones, mas
abajo esta la explicación pero, veamos el código…

1 <?php
2 /*
3 www.notas-programacion.com
4     Descripción:  
5 Este archivo permite guardar un nuevo usuario.
6     Archivo:    guardarRegistro.php
7 */
8     //Recuperar los datos del formulario de registro
9     $str_nombre         =trim($_POST['tx_nombre']);
10     $str_apPaterno  =trim($_POST['tx_apPaterno']);
11     $str_apMaterno  =trim($_POST['tx_apMaterno']);
12     $str_correo         =trim($_POST['tx_correo']);
13     $str_username       =trim($_POST['tx_username']);
14     $str_password       =trim($_POST['tx_password']);
15     $str_password2  =trim($_POST['tx_password2']);
16     $i_TipoUsuario  =trim($_POST['i_tipoUsuario']);
17
18     //Devuelve true si la cadena que llega esta VACIA
19     function estaEnBlanco($cadena) {
20         if(strlen( trim($cadena) ) == 0 )
21             return true;
22         return false;
23     }
24
25     //Devuelve true si la longitud de la cadena (primer parametro)
26     // que llega  es menor que el numero (segundo parametro)
27     function validaTamanio($cadena,$longitud) {
28         if(strlen( trim($cadena) ) < $longitud )
29             return true;
30         return false;
31     }
32
33     // devuelve true SI ha escrito, un email NO VALIDO
34     function esCorreoInvalido($str_email) {
35         if(!filter_var(trim($str_email), FILTER_SANITIZE_EMAIL))
36             return true;
37         return false;
38     }
39
40     // devuelve una cadena escapada de algunos caracteres que
41     // pudieran servir para un ataque de sql injection
42     function escaparQuery($cadena) {
43         $str_KeywordsSQL            = array("select ","insert ","delete ","update ","union ");
44         $str_OperadoresSQL      = array("like ","and ","or ","not ","<",">","<>","=","<");
45         $str_DelimitadoresSQL = array(";","(",")","'");
46
47         //Quitar palabras reservadas y operadores
48         for($i=0; $i<count($str_KeywordsSQL); $i++) {
49             $cadena = str_replace($str_KeywordsSQL[$i], "",strtolower($cadena) );

http://www.notas­programacion.com/2014/10/autenticacion­de­usuarios­en­php­y­mysql/ 16/22
15/6/2015 Autenticación de usuarios en PHP y MySql | Notas de Programación
50         }
51         for($i=0; $i<count($str_OperadoresSQL); $i++) {
52             $cadena = str_replace($str_OperadoresSQL[$i], "",strtolower($cadena) );
53         }
54         for($i=0; $i<count($str_DelimitadoresSQL); $i++) {
55             $cadena = str_replace($str_DelimitadoresSQL[$i], "",strtolower($cadena) );
56         }
57
58         return $cadena;
59     }
60
61
62     $mensajesAll= "";
63
64     //Mensajes para el nombre
65     if( estaEnBlanco($str_nombre) )
66         $mensajesAll = "<li>Por favor, escriba su Nombre.</li>";
67     if( validaTamanio($str_nombre,3) )
68         $mensajesAll .= "<li>Su Nombre como minimo debe tener 3 caracteres.</li>";
69     //Mensajes para el Apellido Paterno
70     if( estaEnBlanco($str_apPaterno) )
71         $mensajesAll .= "<li>Por favor, escriba su Apellido Paterno.</li>";
72     if( validaTamanio($str_apPaterno,3) )
73         $mensajesAll .= "<li>Su Apellido Paterno como minimo debe tener 3 caracteres.</li>";
74     //Mensajes para el Apellido Materno
75     if( estaEnBlanco($str_apMaterno) )
76         $mensajesAll .= "<li>Por favor, escriba su Apellido Materno.</li>";
77     if( validaTamanio($str_apMaterno,3) )
78         $mensajesAll .= "<li>Su Apellido Materno como minimo debe tener 3 caracteres.</li>";
79     //Mensajes para el Correo electronico
80     if( estaEnBlanco($str_correo) || validaTamanio($str_correo,5) || esCorreoInvalido($str_correo) )
81         $mensajesAll .= "<li>Por favor, escriba una direccion de correo electronico valida.</li>";
82     //Mensajes para el nombre de usuario
83     if( estaEnBlanco($str_username) )
84         $mensajesAll .= "<li>Por favor, escriba un nombre de usuario. Este dato le servira para iniciar sesion y ver el contenido.</li>"
85     if( validaTamanio($str_username,5) )
86         $mensajesAll .= "<li>Su nombre de usuario como minimo debe tener 5 caracteres.</li>";
87     //Mensajes para el password
88     if( estaEnBlanco($str_password) )
89         $mensajesAll .= "<li>Por favor, escriba una contrase&ntilde;a.</li>";
90     if( validaTamanio($str_password,5) )
91         $mensajesAll .= "<li>Su contrase&ntilde;a como minimo debe tener 5 caracteres.</li>";
92     //Mensajes para la confirmacion del password
93     if( estaEnBlanco($str_password2) || validaTamanio($str_password2,5) )
94         $mensajesAll .= "<li>Por favor, confirme la contrase&ntilde;a anterior.</li>";
95     if( trim($str_password) != trim($str_password2) )
96         $mensajesAll .= "<li>Por favor, repita la contrase&ntilde;a anterior.</li>";  
97     //Mensajes para el tipo de usuario
98     if( estaEnBlanco($i_TipoUsuario) )
99         $mensajesAll .= "<li>Por favor, indique el tipo de usuaurio.</li>";
100
101     $log = $mensajesAll."<br>";
102
103     //Si se generaron mensajes de error al validar...
104     if ( trim($mensajesAll) != "" ) {
105         //..Redireccion a la pagina de registro para mostrar msg de error al usuario
106         //Enviar los datos que habia escrito antes de enviar
107     ?>
108     <form id="frm_error"   name="frm_error" method="post" action="registro.php">
109         <input type="hidden" name="error" value="1" />
110         <input type="hidden" name="msgs_error" value='<?php echo $mensajesAll ?>' />
111         <input type="hidden" name="str_nombre" value='<?php echo $str_nombre ?>' />
112         <input type="hidden" name="str_apPaterno" value='<?php echo $str_apPaterno ?>' />
113         <input type="hidden" name="str_apMaterno" value='<?php echo $str_apMaterno ?>' />
114         <input type="hidden" name="str_correo" value='<?php echo $str_correo ?>' />
115         <input type="hidden" name="str_username" value='<?php echo $str_username ?>' />
116         <input type="hidden" name="str_password" value='<?php echo $str_password ?>' />
117         <input type="hidden" name="str_password2" value='<?php echo $str_password2 ?>' />
118     </form>
119     <script type="text/javascript">
120         //Redireccionar con el formulario creado
121         document.frm_error.submit();
122     </script>
123 <?php
124         exit;
125     }
126 ?>
127 <!DOCTYPE html>
128 <html xmlns="http://www.w3.org/1999/xhtml">
129 <head>
130     <title>.:: Registrar Usuario ::. </title>
131
132     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
133     <link rel="stylesheet" href="css/estilos.css" type="text/css">
134     <script src="js/jquery171.js" type="text/javascript"></script>
135     <script src="js/jquery.validate.js" type="text/javascript"></script>
136     <script type="text/javascript" src="js/jquery.alerts.js"></script>
137     <link href="css/query.alerts.css" rel="stylesheet" type="text/css" />
138
139     <script type="text/javascript">
140     <!--
141         $(document).ready(function() {
142
143         });
144     // -->
145     </script>
146
147 </head>

http://www.notas­programacion.com/2014/10/autenticacion­de­usuarios­en­php­y­mysql/ 17/22
15/6/2015 Autenticación de usuarios en PHP y MySql | Notas de Programación
148 <body>
149
150 <?php
151     $mensajesAll                = "";
152     $username_duplicado = false;
153     $email_duplicado        = false;
154     //Escapar las cadenas para avitar SQL Injection
155     $str_username = escaparQuery($str_username);
156     $str_correo     = escaparQuery($str_correo);
157
158     //Conectar la BD
159     include("conectar_bd.php");
160     conectar_bd();
161
162     
163     //Validar que el nombre de usuario no exista en la BD
164     $sql = "SELECT  id_usuario  FROM tbl_users
165     WHERE tx_username = '".trim($str_username)."';";
166     $rs_sql = mysql_query($sql);
167     $log .=  $sql."<br>";
168         
169     //Si ya existe el usuario en la BD...
170     if ( $fila  = mysql_fetch_object($rs_sql) ) {
171         $mensajesAll = "<li>El nombre de usuario <b>".$str_username."</b> ya fue registrado
172         por otra persona. Por favor, escriba otro.</li>";
173         $username_duplicado = true;
174     }
175
176     //Validar que el email no exista en la BD
177     $sql = "SELECT  id_usuario  FROM tbl_users
178     WHERE tx_correo='".$str_correo."';";
179     $rs_sql = mysql_query($sql);
180     $log .=  $sql."<br>";
181
182     
183     //Si ya existe el email en la BD...
184     if ( $fila  = mysql_fetch_object($rs_sql) ) {
185         $mensajesAll = "<li>El correo electronico <b>".$str_correo."</b> ya fue registrado
186         por otra persona. Por favor, escriba otro.</li>";
187         $email_duplicado        = true;
188     }
189     //Si ambos datos ya estan en la Base de datos mostrar un solo msg
190     if( $username_duplicado && $email_duplicado)
191         $mensajesAll = "<li>Ambos, nombre de usuario <b>".$str_username."</b>
192         y correo electronico <b>".$str_correo."</b> ya fueron registrados por otra persona.
193         Por favor, cambie esos datos.</li>";
194     //..Redireccion a la pagina de registro para mostrar msg de error al usuario
195     //Enviar los datos que habia escrito antes de enviar
196     
197     $log .=  $mensajesAll."<br>";
198
199     
200     if ( trim($mensajesAll) != "" ) {
201         //..Redireccion a la pagina de registro para mostrar msg de error al usuario
202         //Enviar los datos que habia escrito antes de enviar
203         ?>
204         <form id="frm_error"   name="frm_error" method="post" action="registro.php">
205             <input type="hidden" name="error" value="2" />
206             <input type="hidden" name="msgs_error" value='<?php echo $mensajesAll ?>' />
207             <input type="hidden" name="str_nombre" value='<?php echo $str_nombre ?>' />
208             <input type="hidden" name="str_apPaterno" value='<?php echo $str_apPaterno ?>' />
209             <input type="hidden" name="str_apMaterno" value='<?php echo $str_apMaterno ?>' />
210             <input type="hidden" name="str_correo" value='<?php echo $str_correo ?>' />
211             <input type="hidden" name="str_username" value='<?php echo $str_username ?>' />
212             <input type="hidden" name="str_password" value='<?php echo $str_password ?>' />
213             <input type="hidden" name="str_password2" value='<?php echo $str_password2 ?>' />
214         </form>
215         <script type="text/javascript">
216             //Redireccionar con el formulario creado
217             document.frm_error.submit();
218         </script>
219             <?php
220         exit;
221     }
222     
223     
224     //..Si llega asta aqui es que todos los datos son validos, procedemos a darlo de alta en BD
225     $str_elNombre               = $str_nombre." ".$str_apPaterno;
226     $str_elNombreCompleto = $str_nombre." ".$str_apPaterno." ".$str_apMaterno;
227
228     
229     //Formar el query para el insert del nuevo usuario
230     $queryInsert="INSERT INTO tbl_users (
231     tx_nombre,
232     tx_apellidoPaterno,
233     tx_apellidoMaterno,
234     tx_correo,
235     tx_username,
236     tx_password,
237     id_TipoUsuario,
238     dt_registro )
239     VALUES(
240     '".$str_nombre."',
241     '".$str_apPaterno."',
242     '".$str_apMaterno."',
243     '".$str_correo."',
244     '".$str_username."',
245     '".md5($str_password)."',

http://www.notas­programacion.com/2014/10/autenticacion­de­usuarios­en­php­y­mysql/ 18/22
15/6/2015 Autenticación de usuarios en PHP y MySql | Notas de Programación
246     ".$i_TipoUsuario.",
247 '".date("Y-m-d H:i:s")."');";
248     
249     $log .=  $queryInsert."<br>";
250
251     //echo $log;
252     //exit;
253     
254     mysql_query($queryInsert);
255
256     // Le  Envio  un correo electronico  de bienvenida
257     $destinatario = $str_correo;                    //A quien se envia
258     $nomAdmin           = 'Webmaster Notas programacion';           //Quien envia
259     $mailAdmin      = 'notaspro@notas-programacion.com';       //Mail de quien envia
260     $urlAccessLogin = 'http://localhost/autenticar_usuarios';       //Url de la pantalla de login
261
262     $elmensaje = "";
263     $asunto = $str_elNombre.", Gracias por registrarte!";
264
265     $cuerpomsg ='
266     <h2>.::Registrar usuarios::.</h2>
267     <p>Le damos la mas cordial bienvenida, desde ahora usted podra gozar de los beneficios de
268     haberse identificado y acceder a contenido exclusivo de esta comunidad.</p>
269         <table border="0" >
270         <tr>
271             <td colspan="2" align="center" >Sus datos de acceso para <a href="'.$urlAccessLogin.'">'.$urlAccessLogin.'</a><br></td>
272         </tr>
273         <tr>
274             <td> Nombre </td>
275             <td> <b>'.$str_elNombreCompleto.'</b> </td>
276         </tr>
277         <tr>
278             <td> Nombre de usuario </td>
279             <td> <b>'.$str_username.'</b> </td>
280         </tr>
281         <tr>
282             <td> Password </td>
283             <td> <b>'.$str_password.'</b> </td>
284         </tr>
285         </table> <br/><br/>
286     <p><b>Gracias por su preferencia, hasta pronto.</b></p> <br><br>';
287
288     date_default_timezone_set('America/Mexico_City');
289
290     //Establecer cabeceras para la funcion mail()
291     //version MIME
292     $cabeceras = "MIME-Version: 1.0\r\n";
293     //Tipo de info
294     $cabeceras .= "Content-type: text/html; charset=iso-8859-1\r\n";
295     //direccion del remitente
296     $cabeceras .= "From: ".$nomAdmin." <".$mailAdmin.">";
297     $i_EmailEnviado = 0;
298     
299     //Si se envio el email
300     if( mail($destinatario,$asunto,$cuerpomsg,$cabeceras) )
301         $i_EmailEnviado = 1;
302     
303     //Cerrrar conexion a la BD
304     mysql_close($conexio);
305
306     // Mostrar resultado del registro
307     ?>
308     <form id="frm_registro_status"   name="frm_registro_status" method="post" action="index.php">
309         <input type="hidden" name="status_registro" value="1" />
310         <input type="hidden" name="i_EmailEnviado" value='<?php echo $i_EmailEnviado ?>' />
311     </form>
312     <script type="text/javascript">
313         //Redireccionar con el formulario creado
314         document.frm_registro_status.submit();
315     </script>
316 </body>
317 </html>

Empezamos recogiendo en variables locales a este archivo los datos que nos llegan del archivo registro.php, esto se hace de la linea 8 a
la l6. Después definimos 4 funciones, las cuales mas adelante nos servirán para hacer validaciones con los datos que acabamos de recibir.
Cada una tiene un breve explicación así que me ahorrare volver a hacerlo.

De la linea 64 a la 99 validamos que los datos que llegan no vengan vacíos (en blanco), ademas para algunos campos como el username
y password validamos su tamaño. Observa como para cada campo que pudiera venir vació o no cumplir el tamaño se siguen revisando
los demás pero se agrega un ítem <li> con la descripción del error. En la linea 104 se revisa si la lista NO esta vacía, sino esta vacía
entonces regresamos todos los datos al archivo registro.php, para que el usuario no tenga que volver a escribirlos y solo corrija los que
tienen error, y ademas mandamos una variable llamada error y la lista de errores que ocurrieron (con su descripción). Ademas de
mandar los errores debemos detener la ejecución de este archivo, esto se hace en la linea 124.

Supongamos que no hubo errores de campos en blanco ni tamaños, entonces no se cumplirá la condición de la linea 104, entonces, el
interprete de PHP se saltara hasta la linea 126 y continuara su ejecución…

Lo que haremos ahora sera validar que el nombre de usuario y el email escritos no existan en la BD, si algunos de los dos ya fue
registrado volveremos a direccionar la ejecución al archivo registro.php para que escriba otro username/password. Esto se hace de la
linea 151 a 221, el código esta comentado por lo tanto evitare redundar en la explicación.

Tal y como dice la linea 224, si la ejecución llega hasta dicha linea es que todos los datos son validos (han pasado las validaciones),

http://www.notas­programacion.com/2014/10/autenticacion­de­usuarios­en­php­y­mysql/ 19/22
15/6/2015 Autenticación de usuarios en PHP y MySql | Notas de Programación

entonces procedemos a darlo de alta en la base de datos. Después de formar la sentencia SQL (insert) de la linea 230 a la 247, se ejecuta
(linea 254) y con lo cual el usuario ha sido dado de alta. Observa como en varios puntos del script voy guardando un log de la ejecución
(errores, querys, etc) en una variable llamada $log puedes imprimirla y detener la ejecución en cualquier momento para ver que pasa
detrás del telón, observa como lo hago yo en la linea 251 y 252.

Como un plus e puesto el código para que se le puedan enviar sus datos de acceso en un email, si recuerdas ya vimos como enviar un
email en PHP en otra entrada de blog. A continuación un pantallazo del email que le llega al usuario que se acaba de registrar:

Después de enviarle el email con sus datos de acceso, direccionamos al usuario al archivo index.php (recuerda que ahi dio click en el
enlace Deseo registrarme) junto con una bandera; $status_registro si esta bandera llega con valor 1 significa que el registro fue exitoso.
el archivo index.php ya esta preparado para revisar si le llega esta bandera (fíjate en linea 102). Pantalla de aviso que ha sido registrado:

Por ultimo no hay que olvidarse de cerrar la conexión a la base de datos, esto lo hago en la linea 304 del archivo guardarRegistro.php.

Demo

Si deseas ver el ejemplo funcionando Da click aquí, usa estos datos para probar el ejemplo, Usuario: visitante_wp, Contraseña: 12345.
Por motivos de seguridad, solo esta habilitado el inicio de sesión, ni la recuperación de password ni el registro funcionan.

Bueno, eso es todo, si deseas obtener el código fuente del ejemplo, desde GitHub te los puedes descargar:
Descargar ejemplo, hay varios ejemplos, la carpeta se llama autenticar_usuarios.

Por otra parte, ¿Podrías regalarme un like si te gusto el articulo?.

Hasta pronto,
Saludos.

Etiquetas:autenticacion crifrado mail mysql permisos php privilegios programacion sql usuario

Acerca de notaspro

http://www.notas­programacion.com/2014/10/autenticacion­de­usuarios­en­php­y­mysql/ 20/22
15/6/2015 Autenticación de usuarios en PHP y MySql | Notas de Programación

Fundador de Notas-Programacion.com y amante de las nuevas tecnologias de desarrollo.

Deja un comentario
Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

Nombre *

Correo electrónico *

Web

Comentario

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite="">


<cite> <code class="" title="" data‐url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data‐
url=""> <span class="" title="" data‐url="">

Publicar comentario

Busca un tema

Buscar en la web… Buscar

Siguenos en redes sociales


Feed RSS Twitter Facebook Google+ Flickr YouTube

Lo último que hemos escrito

Conceptos básicos de Java & Spring Framework -Entrega II


Conceptos básicos de Java & Spring Framework -Entrega I
¿Qué es Spring Framework?
Autenticación de usuarios en PHP y MySql
Generación de tokens de seguridad con PHP y validación en BD MySql

Regalanos un like!

Notas de Programación
Like

Notas de
Programación
November 2, 2014

Nuevamente buenas tardes, dejo el
ultimo enlace al articulo acerca de
Spring framework. Las notas se
titulan: Conceptos básicos de Java
& Spring Framework ­Entrega II
(Interfaces en Java).
http://www.notas­programacion.com/
…/conceptos­basicos­de­j…/
Espero les agrade, saludos.

See Translation

Con
10 people like Notas de Programación.

Facebook social plugin

¡Síguenos en Google+!

http://www.notas­programacion.com/2014/10/autenticacion­de­usuarios­en­php­y­mysql/ 21/22
15/6/2015 Autenticación de usuarios en PHP y MySql | Notas de Programación

Notas de Programacion

Seguir +1

Nuestros temas

acoplamiento AOP autenticacion bienvenida buenas practicas cohesión core Core container crifrado desacoplamiento extends hash html implements ingeniería
de software inicio interface interfaces java javascript js json lenguaje mail md5 mysql nivel patrón de diseño Dependency Injection patrón de diseño Factory permisos php pojo POJOS

POO privilegios programacion seguridad sha512 spring Spring Core sql token tutorial usuario validacion
Inicio
Java
Servlets & JSP
Spring
Hibernate
Struts 2
PHP
Volver arriba

Volver arriba

Copyright Notas de Programación

http://www.notas­programacion.com/2014/10/autenticacion­de­usuarios­en­php­y­mysql/ 22/22

Vous aimerez peut-être aussi