Hacer login de usuarios con PHP y MySQL

23 enero, 2008 por Mr. FotoPex Dejar una respuesta »

 

 

Un sistema de registro y reconocimiento de usuarios es utilizado para garantizar el acceso a ciertas áreas de nuestro sitio Web.

Debemos de crear una tabla que vamos a utilizar en la base de datos MySQL.

 

MySQL:
  1. CREATE TABLE `usuarios` (
  2.   `id` INT(11) NOT NULL AUTO_INCREMENT,
  3.   `usuario` VARCHAR(20) NOT NULL,
  4.   `password` VARCHAR(10) NOT NULL,
  5.   `descripcion` TEXT character SET utf8 collate utf8_spanish_ci,
  6.   `email` VARCHAR(45) character SET utf8 collate utf8_spanish_ci DEFAULT NULL,
  7.   `fecha` DATE NOT NULL,
  8.   PRIMARY KEY  (`id`)
  9. )

 

 

Ya tenemos la estructura de nuestra tabla de usuarios.

Ahora una pagina index.php donde colocaremos el siguiente código:

 

 

PHP:
  1. <?php session_start();
  2.  
  3. echo 'Bienvenido, ';
  4.  
  5. if (isset($_SESSION['k_username'])) {
  6.     echo '<b>'.$_SESSION['k_username'].'</b>.';
  7.     echo '<p><a href="logout.php">Logout</a></p>';
  8. }else{
  9.     echo '<p><a href="login.php">Login</a></p>
  10.      <p><a href="registrar.php">Registrar</a></p>';
  11. }
  12. ?>

 

 

Ahora el formulario para hacer login.php

 

 

HTML:
  1. <form action="validar_usuario.php" method="post">
  2. Usuario:<input type="text" name="usuario" size="20" maxlength="20" />
  3. <br />
  4. Password:<input type="password" name="password" size="10" maxlength="10" />
  5. <br />
  6. <input type="submit" value="Ingresar" />
  7. </form>

 

 

Seguimos con el archivo validar_usuario.php el cual verificará los datos del archivo login.php

 

 

PHP:
  1. <?php session_start();
  2.  
  3. //datos para establecer la conexion con la base de mysql.
  4. mysql_connect('localhost','usuario','password')or die ('Ha fallado la conexi&oacute;n: '.mysql_error());
  5. mysql_select_db('mi_base')or die ('Error al seleccionar la Base de Datos: '.mysql_error());
  6.  
  7. function quitar($mensaje)
  8. {
  9.     $nopermitidos = array("'",'\\','<','>',"\"");
  10.     $mensaje = str_replace($nopermitidos, "", $mensaje);
  11.     return $mensaje;
  12. }     
  13.  
  14. if(trim($HTTP_POST_VARS["usuario"]) != "" && trim($HTTP_POST_VARS["password"]) != "")
  15. {
  16.     // Puedes utilizar la funcion para eliminar algun caracter en especifico
  17.     //$usuario = strtolower(quitar($HTTP_POST_VARS["usuario"]));
  18.     //$password = $HTTP_POST_VARS["password"];
  19.    
  20.     // o puedes convertir los a su entidad HTML aplicable con htmlentities
  21.     $usuario = strtolower(htmlentities($HTTP_POST_VARS["usuario"], ENT_QUOTES));   
  22.     $password = $HTTP_POST_VARS["password"];
  23.      
  24.  
  25.     $result = mysql_query('SELECT password, usuario FROM usuarios WHERE usuario=\''.$usuario.'\'');
  26.     if($row = mysql_fetch_array($result)){
  27.         if($row["password"] == $password){
  28.  
  29.             $_SESSION["k_username"] = $row['usuario'];
  30.            
  31.             echo 'Has sido logueado correctamente '.$_SESSION['k_username'].' <p>';
  32.             echo '<a href="index.php">Index</a></p>';
  33.            
  34.             //Elimina el siguiente comentario si quieres que re-dirigir autom&aacute;ticamente a index.php
  35.            
  36.             /*Ingreso exitoso, ahora sera dirigido a la pagina principal.
  37.             <SCRIPT LANGUAGE="javascript">
  38.             location.href = "index.php";
  39.             </SCRIPT>*/
  40.  
  41.         }else{
  42.             echo 'Password incorrecto';
  43.         }
  44.     }else{
  45.         echo 'Usuario no existente en la base de datos';
  46.     }
  47.     mysql_free_result($result);
  48. }else{
  49.     echo 'Debe especificar un usuario y password';
  50. }
  51. ?>

 

 

El archivo registrar.php, ahí crearemos un usuario nuevo.

 

 

PHP:
  1. <?php session_start();
  2.  
  3. //datos para establecer la conexion con la base de mysql.
  4. mysql_connect('localhost','usuario','password')or die ('Ha fallado la conexi&oacute;n: '.mysql_error());
  5. mysql_select_db('mi_base')or die ('Error al seleccionar la Base de Datos: '.mysql_error());
  6.  
  7. function formRegistro(){
  8. ?>
  9. <form action="registrar.php" method="post">
  10. Usuario (max 20):
  11.   <input type="text" name="username" size="20" maxlength="20" /><br />
  12. Password (max 10):
  13. <input type="password" name="password" size="10" maxlength="10" />
  14. Confirma: <input type="password" name="password2" size="10" maxlength="10" /><br />
  15. Email (max 40):
  16. <input type="text" name="email" size="20" maxlength="40" /><br />
  17. <input type="submit" value="Registrar" />
  18. </form>
  19. <?php
  20. }
  21.  
  22. // verificamos si se han enviado ya las variables necesarias.
  23. if (isset($_POST["username"])) {
  24.     $username = $_POST["username"];
  25.     $password = $_POST["password"];
  26.     $password2 = $_POST["password2"];
  27.     $email = $_POST["email"];
  28.     // Hay campos en blanco
  29.     if($username==NULL|$password==NULL|$password2==NULL|$email==NULL) {
  30.         echo "un campo est&aacute; vacio.";
  31.         formRegistro();
  32.     }else{
  33.         // ¿Coinciden las contrase&ntilde;as?
  34.         if($password!=$password2) {
  35.             echo "Las contrase&ntilde;as no coinciden";
  36.             formRegistro();
  37.         }else{
  38.             // Comprobamos si el nombre de usuario o la cuenta de correo ya exist&iacute;an
  39.             $checkuser = mysql_query("SELECT usuario FROM usuarios WHERE usuario='$username'");
  40.             $username_exist = mysql_num_rows($checkuser);
  41.            
  42.             $checkemail = mysql_query("SELECT email FROM usuarios WHERE email='$email'");
  43.             $email_exist = mysql_num_rows($checkemail);
  44.    
  45.             if ($email_exist>0|$username_exist>0) {
  46.                 echo "El nombre de usuario o la cuenta de correo estan ya en uso";
  47.                 formRegistro();
  48.             }else{
  49.                 $query = 'INSERT INTO usuarios (usuario, password, email, fecha)
  50.                 VALUES (\''.$username.'\',\''.$password.'\',\''.$email.'\',\''.date("Y-m-d").'\')';
  51.                
  52.                 mysql_query($query) or die(mysql_error());
  53.                 echo 'El usuario '.$username.' ha sido registrado de manera satisfactoria.<br />';
  54.                 echo 'Ahora puede entrar ingresando su usuario y su password <br />';
  55.                 ?>
  56.                 <FORM ACTION="validar_usuario.php" METHOD="post">
  57.                   Usuario : <INPUT TYPE="text" NAME="usuario" SIZE=20 MAXLENGTH=20><br />
  58.                   Password: <INPUT TYPE="password" NAME="password" SIZE=10 MAXLENGTH=20><br />
  59.                   <INPUT TYPE="submit" VALUE="Ingresar">
  60.                 </FORM>
  61.                 <?php
  62.                
  63.             }
  64.         }
  65.     }
  66. }else{
  67.     formRegistro();
  68. }
  69. ?>

 

Finalmente el archivo logout.php, ahí cerraremos la sesión.

 

PHP:
  1. <?php session_start();
  2. // Borramos toda la sesion
  3. echo 'Ha terminado la session <p><a href="index.php">index</a></p>';
  4. ?>
  5. <SCRIPT LANGUAGE="javascript">
  6. location.href = "index.php";
  7. </SCRIPT>

 

El sistema creado es sencillo para que sea fácil de entender, Y no olvides dejar tus comentarios.

floppy.jpg
Clic para descargar el archivo

Actualización: debido a los problemas que hay al momento de hacer copy/paste se anexan los archivos del ejemplo. Recuerda que es solo el principio, falta:

Encriptar las claves antes de enviarlas, hacer la conexión como función y todo lo que se te ocurra o puedas aportar.

Actualización.
A los amigos que me han sobre las medidas de seguridad que debemos de procurar, algunas son:

La encriptación de la clave mediante MD5 o SHA1
Utilización de htmlentities y html_entity_decode

 

Cuando el usuario mete algún campo erróneo o deja algo en blanco se llama a la función formRegistro(); y borra todos los campos aunque estén correctos, ¿cómo puedo mantener los campos ya rellenados? para no hacer al usuario que vuelva a meter los datos.

Puedes utilizar algo asi :

 

value="<?php if(isset($_post['campo']) echo $_post['campo']; ?>"

 

y recuerda utilizar htmlentities y html_entity_decode para evitar la inyección de código.

Y para los amigos que me han preguntado como podemos bloquear las paginas si no hace login, les comento que yo tengo un sistema basado en niveles y que más adelante la publicaré, mientras tanto podemos hacer una interpretación más ligera y sería algo más o menos asi:

Agregamos una tabla de nombre autorizaciones, y 3 campos:
id - autonumérico
pagina - varchar (en este campo vamos a ingresar las secciones o página donde necesitan hace login para poder verlas)
usuario - texto largo (los nombres de los usuarios con autorización para ver esta pagina separados por comas)

Vamos a crear una pagina con el nombre de funciones.php con el siguiente código:

PHP:
  1. <?php session_start();
  2. function conectar(){
  3.     //datos para establecer la conexion con la base de mysql.
  4.     mysql_connect('localhost','usuario','password')or die ('Ha fallado la conexión: '.mysql_error());
  5.     mysql_select_db('mi_base')or die ('Error al seleccionar la Base de Datos: '.mysql_error())
  6. }
  7.  
  8. function puede_ver($pagina=''){
  9.     $usuario = strtoupper($_SESSION['k_username']);
  10.     $result = mysql_query('SELECT usuario FROM autorizaciones WHERE pagina=\''.$pagina.'\' ');
  11.     if($row = mysql_fetch_array($result)){
  12.         $usuarios=$row['usuario']; // obtenemos los nombres de los usuarios
  13.         $array_usuarios= array(); // creamos un arrar
  14.         $array_usuarios=explode(',',$usuarios); // y los metemos pos la separación de la coma
  15.         $total=count($array_usuarios); // cuantos tenemos ?
  16.         if (in_array($usuario, $array_usuarios)) { // si encontramos al ganador ok
  17.             return true;
  18.         }else{ // si no pues un false como respuesta
  19.             return false;
  20.         }
  21.     }
  22. }
  23. ?>

Olvidandonos un poco de la página index.php vamos a crear nuestra primer página restringida con el nombre visita_fotopex.php, con este método no solo puedes restringir el acceso a una pagina, lo puedes hacer por secciones, por ejemplo para restringir a una página completa el código de visita_fotopex.php seria así:

PHP:
  1. <?php session_start();
  2. // no olvidemos incluir nuestras funciones
  3. include("funciones.php");
  4. conectar();
  5. if (puede_ver('pagina')==false){
  6.     die('<br /><br />No tiene permiso para esta &aacute;rea, consulte a <a href="http://ayuda.fotopex.com">www.ayuda.fotopex.com</a><br /><br /><br />');
  7. }
  8. ?>

y para restringir una sección simplemente lo inviertes

PHP:
  1. <?php session_start();
  2. // no olvidemos incluir nuestras funciones
  3. include("funciones.php");
  4. conectar();
  5. if (puede_ver('seccion_a')){
  6.     echo '<br /><br />Ahora puedes ver esta sección y sigue visitando <a href="http://ayuda.fotopex.com">www.ayuda.fotopex.com</a><br /><br /><br />';
  7. }
  8. ?>

Espero que te ayude y sigas visitando www.ayuda.fotopex.com.

Publicidad

117 comentarios

  1. Gabriela dice:

    Hola, me parece muy bueno este tutorial pero no me sale la practica, ya que me sale un error que dice Access denied for user: ‘@’ localhost ‘(using password: YES)

    Me podrian ayudar

    Gracias

  2. Camilo dice:

    hola,lo que me pasa es esto, mira que yo pegue los codigos php en una pagina completa, con el diseño y todo como la principal,me voy a registrar y me abre es el documento php, con el nombre de register.php, pero el login si funciona bien, como hago para poder registrarme bien?

  3. netha carnal esta muy bien el tutorial ni te imaginas lo k nos ayudo a mi y a un amigo con lo de residencias….netha k gracias

  4. Nathy dice:

    De verdad escribo para agradecerte, me has ayudado muchísimo con esto para mi tesis. Créeme que le había pedido ayuda a “amigos”, pero es aquí donde te das cuenta que los de verdad se cuentan con la mano y también que los ratones son los primeros en huir cuando se hunde el barco.

    Eso, el código me funcionó excelente, le agregué una ventana de bienvenida con flash y modifiqué lo de la creación de usuarios y en lo otro un par de cosas, pero en esencia es el mismo código.

    Sinceramente agradecida, Nathalie

  5. jose luis dice:

    hola excelente tutorial ,,pero tengo un problema a la hora de login …no puedo validar al usuario me sale esto :
    La conexión ha sido reiniciada

    La conexión al servidor fue reiniciada mientras la página se cargaba.

    * El sitio podría estar no disponible temporalmente o
    demasiado ocupado. Vuelva a intentarlo en unos momentos.

    * Si no puede cargar ninguna página, compruebe la conexión
    de red de su ordenador.

    * Si su ordenador o red están protegidos por un cortafuegos
    o proxy, asegúrese de que Firefox tiene permiso para
    acceder a la web.

    /// espero me puedan ayudar

  6. Lauren dice:

    muy bueno el tutorial pero me saca error al colocar los datos acá, no me deja logearme sacandome un error de php…

    mysql_connect(’216.108.239.71′,’a4848702_ontf’,'password’)or die (‘Ha fallado la conexión: ‘.mysql_error());

    haber si me pueden hechar una mano jeje
    mysql_select_db(‘a4848702_ontf’)or die (‘Error al seleccionar la Base de Datos: ‘.mysql_error());

  7. Jpatrick dice:

    Saludos
    Buena práctica pero cómo puedo solucionar el problema de que cuándo me deslogueo el botón atrás del navegador no me retorne a la página anterior. Encontré algo como estos:

    Pero no resuelve el problema para este tipo de casos.

    Agredecería su ayuda

  8. gerome dice:

    gracias la verdad me funciono de lo mejor

  9. punk3s3r dice:

    Hola funciona a la perfeccion tu sistema de login, pero como le hago que cuando me autentifique correctamente me mande a una pagina automaticamente, o como uso el codigo para bloquear ciertas areas de mi pagina web, espero y me entiendas!! cual seria el codigo que devo poner para que este bloqueda el area y hasta que me logue se pueda ver sin ningun problema saludos y espero respuesta..

  10. daniela dice:

    Hola, muy bueno
    andaba buscando algo asi
    y funciona, salvo en la parte de validar usuarios que no me entraba al if pero cambie como dijeron en los comentarios los HTTP_POST_
    por _POST y corrio altiro
    muy buen tutorial
    se agradece

  11. ivan dice:

    me muestra este error cuando quiero loguearme !!
    Debe especificar un usuario y password

  12. antonio dice:

    estimado yo tengo el mismo problema

    “”"me muestra este error cuando quiero loguearme !!
    Debe especificar un usuario y password”"”

    alguna solucion????

  13. David dice:

    hola, me puedes ayudar con esto:

    cuando hago una pagina privada me sale:

    Fatal error: Call to undefined function conectar() in /home/a9397138/public_html/login_php/index.html on line 106

    GRACIAS por tu apoyo
    es una buena tutorial

  14. webmaster dice:

    si amigo, un detalle muy importante es que debes incluir el archivo de tus funciones
    include(“funciones.php”);

  15. LinuxLover dice:

    (*_*)
    La neta gracias ,
    te las da un estudiante de chihuahua
    por que es de los mejores tutoriales que me an tocado
    al respecto de este tema
    sigue asi (*_*)

  16. manuel dice:

    Buenas a ver si alguien me puede echar un cable…
    Cuando intento entrar con el login me sale el siguiente error:

    Notice: Undefined variable: HTTP_POST_VARS in \www\LOGIN Y USUARIOS\validar_usuario.php on line 11
    Debe especificar un usuario y password

    La linea en cuestion es:
    if(trim($HTTP_POST_VARS["usuario"]) != “” && trim($HTTP_POST_VARS["password"]) != “”)

    ¿Donde tengo el error?

    Gracias.

  17. Mr. FotoPex dice:

    Amigos, el error mas frecuente es en el copy/paste, pues los caracteres de comillas no se copian bien.

    Pero recuerda que puedes bajarte los archivos del ejercicio.

    floppy.jpg

    Gracias a todos por sus comentarios, Feliz retorno a FotoPex.com
    Recorriendo la Mixteca