30 enero 2012

Hacer login de usuarios con PHP y MySQL

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.

CREATE TABLE `usuarios` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `usuario` VARCHAR(20) NOT NULL,
  `password` VARCHAR(10) NOT NULL,
  `descripcion` TEXT character SET utf8 collate utf8_spanish_ci,
  `email` VARCHAR(45) character SET utf8 collate utf8_spanish_ci DEFAULT NULL,
  `fecha` DATE NOT NULL,
  PRIMARY KEY  (`id`)
)

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. }
?>

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" />
         </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. }
?>

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. }
?>

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";
</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_usuariosarray()// 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. }
?>

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://empresario.mx">www.empresario.mx</a><br /><br /><br />');
  7. }
?>

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://empresario.mx">www.empresario.mx</a><br /><br /><br />';
  7. }
?>





0 comentarios:

Publicar un comentario