Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: Hazama en 12 Diciembre 2013, 16:34 pm



Título: Sistema de registro de usuarios
Publicado por: Hazama en 12 Diciembre 2013, 16:34 pm
Hoy vengo a aportar mi granito de arena y que forma de hacerlo con un pequeno script que desarrolle en PHP y Mysql para la creacion de un sistema para el registro de usuarios.Quizas sea muy basico pero se puede modificar a gusto de cada quien ;)

Registrarse.php
Código
  1. <html>
  2. <head>
  3. <title>Alta de usuarios</title>
  4. </head>
  5. <body>
  6. <form name="registro" method="POST" action="registrar.php">
  7. <table width="200" border="0">
  8. <tr>
  9. <td><label>Nombre:</label></td>
  10. <td><input type="text" name="nombre" /></td>
  11. </tr>
  12.  
  13. <tr>
  14. <td><label>Nombre de usuario:</label></td>
  15. <td><input type="text" name="user" /></td>
  16. </tr>
  17.  
  18. <tr>
  19. <td><label>Password:</label></td>
  20. <td><input type="password" name="pw" /></td>
  21. </tr>
  22.  
  23. <tr>
  24. <td><label>Confirmar password:</label></td>
  25. <td><input type="password" name="pw2" /></td>
  26. </tr>
  27.  
  28. <tr>
  29. <td><label>Email:</label></td>
  30. <td><input type="text" name="email" /></td>
  31. </tr>
  32.  
  33. <tr>
  34. <td></td>
  35. <td><input type="submit" value="Registrarse" /></td>
  36. </tr>
  37. </table>
  38. </form>

Registrar.php
Código
  1. <?php
  2. //Include del archivo de conexion a la base de datos
  3. include("conexion.php");
  4. ///Comprueba que no exista ningun campo vacio
  5. if(isset($_POST['nombre']) && !empty ($_POST['nombre'])&&
  6. isset($_POST['user']) && !empty ($_POST['user'])&&
  7. isset($_POST['pw']) && !empty ($_POST['pw'])&&
  8. (isset($_POST['pw2']) && !empty ($_POST['pw2'])&&
  9. (isset($_POST['email']) && !empty ($_POST['email'])&&
  10. $_POST['pw'] == $_POST['pw2'])))
  11. {
  12. //Realiza conexion al servidor
  13. $conectar = mysql_connect($host,$user,$pw)
  14. //Si no concuerdan los datos lanza error.
  15. or die("No se puede conectar.");
  16. //Seleccion de la base de datos
  17. mysql_select_db($db,$conectar)
  18. or die("Error al a la base de datos.");
  19. ///Inserta los datos en la tabla registro
  20. mysql_query("INSERT INTO  () VALUES ('$_POST[nombre]','$_POST[user]','$_POST[pw]','$_POST[email]')",
  21. $conectar);
  22. echo "El usuario se ha registrado correctamente con los siguientes datos:";
  23. echo "<br>";
  24. echo "Nombre:".$_POST['nombre'];
  25. echo "<br>";
  26. echo "Usuario:".$_POST['user'];
  27. echo "<br>";
  28. echo "Email:".$_POST['email'];
  29. } else
  30. {
  31. echo "Verifica que no haya ningun campo vacio y los passwords coincidan.";
  32. }
  33. ?>

conexion.php
Código
  1. <?php
  2. /*Aqui se introducen los datos de la base de datos
  3. */
  4. //Host de la base datos(ESTE VIENE POR DEFECTO COMO localhost)
  5. $host = "";
  6. //Usuario de la base de datos(POR DEFECTO VIENE COMO ROOT)
  7. $user = "";
  8. //Tu Password
  9. $pw = "";
  10. //Tu base de datos
  11. $db = "";
  12. ?>

Solo espero que no se me haya pasado borrar algun dato de login a la base de datos mientras lo probaba.

Saludos.


Título: Re: Sistema de registro de usuarios
Publicado por: keplerish en 17 Diciembre 2013, 13:27 pm
Toda esa cadena de comprobación con issets no es nada "elegante", y repites continuamente código.

Por otro lado, debes limpiar siempre los datos que introduce el usuario (ya sea GET, POST o cualquier otro), mucho más cuando lo vas a introducir en la base de datos.

Saludos


Título: Re: Sistema de registro de usuarios
Publicado por: Hazama en 18 Diciembre 2013, 04:19 am
Toda esa cadena de comprobación con issets no es nada "elegante", y repites continuamente código.

Por otro lado, debes limpiar siempre los datos que introduce el usuario (ya sea GET, POST o cualquier otro), mucho más cuando lo vas a introducir en la base de datos.

Saludos

soy un poco nuevo en PHP y creo que considerare mucho lo que dices


Título: Re: Sistema de registro de usuarios
Publicado por: #!drvy en 18 Diciembre 2013, 06:15 am
Lo que haces en el if es bastante feo (como dice el compañero) y mas teniendo en cuenta que isset y empty son "mas o menos" lo mismo.

Isset comprobara que la variable esta declarada mientras que empty comprobara si esta declarada y si no esta vacía. Por tanto, solo con empty ya te basta.

Por otro lado, hay un problema.. empty no acepta 0 de valor y retorna false. Para eso, cuando se trata de strings y números, es mejor hacer una comparación con isset y strlen.

Una manera "bonita" de hacerlo es usando una función.
Código
  1. <?php
  2. function comprobar(){
  3.   foreach(func_get_args() as $param){
  4.      if(isset($param)&&strlen($param)>0){continue;}
  5.      else{return false;}
  6.   }
  7.   return true;
  8. }
  9.  
  10. var_dump(comprobar($variable,$variable2,$variable3));
  11. ?>

Esta función, cogerá todos los parámetros que le pases y comprobara a ver si están definidos + si su longitud es mayor a 0 caracteres.

Implementandola en tu código, el if se quedaría así:
Código
  1. if(!empty($_POST) &&
  2. comprobar($_POST['nombre'],$_POST['user'],$_POST['pw'],$_POST['pw2'],$_POST['email']) &&
  3. $_POST['pw']===$_POST['pw2']){
  4. /* Codigo aqui **/
  5. }



Nota que uso 3 = (===) en vez de 2 (==). Te explico. Cuando usas == PHP buscara a ver si la cadena que comparas es igual a la otra. Esto produce un riesgo de seguridad ya que si le indicas a PHP que compare un numero vs un string, PHP convertirá el string a int (y cualquier string convertido a int retorna 0). Ejemplo:

Código
  1. if('abcd'==0){echo 'Son iguales';}else{echo 'No son iguales';}

Utilizando 3= (===), PHP mira a ver si las dos cadenas son idénticas y no si son iguales.. de este modo te saltas este problema. Afortunadamente, HTTP no diferencia entre int y string, trata todo como string, así que no llegaras a este problema en tu código pero es posible que en otro entorno si que se reproduzca y tendrás un buen problema...En fin, acostúmbrate a usar === para comprar strings.



Usa mysqli o PDO.. no uses mysql.. ya esta mas que obsoleto.
http://es.php.net/mysqli
http://es.php.net/pdo



Usa siempre un captcha o en su defecto una limitación si vas a enviar datos a la BD sin mas.. los usuarios pueden ser cabrones y ponerse a enviar miles de consultas a tu BD.



Nunca te fíes del usuario.. siempre limpia y comprueba los campos que recibes de ellos para evitar injeciones.
En este caso tanto mysqli como PDO proporcionan sentencias preparadas que minimizan el efecto de sqli.

http://es.php.net/manual/es/mysqli.quickstart.prepared-statements.php
http://es.php.net/manual/es/pdo.prepared-statements.php

Saludos


Título: Re: Sistema de registro de usuarios
Publicado por: #Aitor en 19 Diciembre 2013, 09:47 am
Hoy vengo a aportar mi granito de arena y que forma de hacerlo con un pequeno script que desarrolle en PHP y Mysql para la creacion de un sistema para el registro de usuarios.Quizas sea muy basico pero se puede modificar a gusto de cada quien ;)

Registrarse.php
Código
  1. <html>
  2. <head>
  3. <title>Alta de usuarios</title>
  4. </head>
  5. <body>
  6. <form name="registro" method="POST" action="registrar.php">
  7. <table width="200" border="0">
  8. <tr>
  9. <td><label>Nombre:</label></td>
  10. <td><input type="text" name="nombre" /></td>
  11. </tr>
  12.  
  13. <tr>
  14. <td><label>Nombre de usuario:</label></td>
  15. <td><input type="text" name="user" /></td>
  16. </tr>
  17.  
  18. <tr>
  19. <td><label>Password:</label></td>
  20. <td><input type="password" name="pw" /></td>
  21. </tr>
  22.  
  23. <tr>
  24. <td><label>Confirmar password:</label></td>
  25. <td><input type="password" name="pw2" /></td>
  26. </tr>
  27.  
  28. <tr>
  29. <td><label>Email:</label></td>
  30. <td><input type="text" name="email" /></td>
  31. </tr>
  32.  
  33. <tr>
  34. <td></td>
  35. <td><input type="submit" value="Registrarse" /></td>
  36. </tr>
  37. </table>
  38. </form>

Registrar.php
Código
  1. <?php
  2. //Include del archivo de conexion a la base de datos
  3. include("conexion.php");
  4. ///Comprueba que no exista ningun campo vacio
  5. if(isset($_POST['nombre']) && !empty ($_POST['nombre'])&&
  6. isset($_POST['user']) && !empty ($_POST['user'])&&
  7. isset($_POST['pw']) && !empty ($_POST['pw'])&&
  8. (isset($_POST['pw2']) && !empty ($_POST['pw2'])&&
  9. (isset($_POST['email']) && !empty ($_POST['email'])&&
  10. $_POST['pw'] == $_POST['pw2'])))
  11. {
  12. //Realiza conexion al servidor
  13. $conectar = mysql_connect($host,$user,$pw)
  14. //Si no concuerdan los datos lanza error.
  15. or die("No se puede conectar.");
  16. //Seleccion de la base de datos
  17. mysql_select_db($db,$conectar)
  18. or die("Error al a la base de datos.");
  19. ///Inserta los datos en la tabla registro
  20. mysql_query("INSERT INTO  () VALUES ('$_POST[nombre]','$_POST[user]','$_POST[pw]','$_POST[email]')",
  21. $conectar);
  22. echo "El usuario se ha registrado correctamente con los siguientes datos:";
  23. echo "<br>";
  24. echo "Nombre:".$_POST['nombre'];
  25. echo "<br>";
  26. echo "Usuario:".$_POST['user'];
  27. echo "<br>";
  28. echo "Email:".$_POST['email'];
  29. } else
  30. {
  31. echo "Verifica que no haya ningun campo vacio y los passwords coincidan.";
  32. }
  33. ?>

conexion.php
Código
  1. <?php
  2. /*Aqui se introducen los datos de la base de datos
  3. */
  4. //Host de la base datos(ESTE VIENE POR DEFECTO COMO localhost)
  5. $host = "";
  6. //Usuario de la base de datos(POR DEFECTO VIENE COMO ROOT)
  7. $user = "";
  8. //Tu Password
  9. $pw = "";
  10. //Tu base de datos
  11. $db = "";
  12. ?>

Solo espero que no se me haya pasado borrar algun dato de login a la base de datos mientras lo probaba.

Saludos.

Me parece un poco hipócrita darte el crédito a ti, cuando es el mismo código el del curso de PHP de "Código facilito".

Pero bueno, no está de más compartir, un saludo.