Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: pedrox@ en 27 Agosto 2008, 19:47 pm



Título: Ayuda con sistema login
Publicado por: pedrox@ en 27 Agosto 2008, 19:47 pm
hola a todos
estoy creando un sistema de login para mi web pero veo que me estoy liando y nose de que forma hacerlo seguro, esto es lo que llevo hecho:

esta es la tabla SQL:

Código
  1. CREATE TABLE users(
  2. id INT NOT NULL AUTO_INCREMENT,
  3. PRIMARY KEY(id),
  4. username VARCHAR(30) NOT NULL,
  5. password VARCHAR(20) NOT NULL);
  6.  
  7. -- USERS --
  8. INSERT INTO `users` VALUES (1, 'admin', '827ccb0eea8a706c4c34a16891f84e7b');


Aquí el code php (login.php):

Código
  1. <?php
  2.  
  3. $dbhost = 'localhost';
  4. $dbuser = 'root';
  5. $dbpass = '12345';
  6. $db = 'web';
  7.  
  8. $conectar = mysql_connect($dbhost,$dbuser,$dbpass);
  9. mysql_select_db($db,$conectar);
  10.  
  11. if (isset($_SESSION['admin_username'])){
  12. echo "Ya estás autentificado";
  13.        header("Location: admin.php");
  14. }
  15.  
  16. if ($_POST['username']) {
  17. $username = $_POST['username'];
  18. $password = $_POST['password'];
  19.  
  20.  
  21. if ($password==NULL) {
  22. echo "La password no fue enviada";
  23. }
  24.  
  25. else{
  26. $query = mysql_query("SELECT username,password FROM users WHERE username = '$username'") or die(mysql_error());
  27. $data = mysql_fetch_array($query);
  28. if($data['password'] != md5($password)) {
  29. echo "Login incorrecto";
  30. }
  31.  
  32. $query = mysql_query("SELECT username,password FROM users WHERE username = '$username'") or die(mysql_error());
  33. $row = mysql_fetch_array($query);
  34. $_SESSION["admin_username"] = $row['username'];
  35. echo "Has sido logueado correctamente ".$_SESSION['admin_username']." y puedes acceder al admin.php.";
  36. }
  37. }
  38. ?>
  39.  
  40.  
  41. <form action='login.php' method='POST'>
  42. <table style='border:1px solid #000000;'>
  43. <tr>
  44. <td align='right'>
  45. Nombre de usuario: <input type='text' size='15' maxlength='25' name='username'>
  46. </td>
  47. </tr>
  48. <tr>
  49. <td align='right'>
  50. Password: <input type='password' size='15' maxlength='25' name='password'>
  51. </td>
  52. </tr>
  53. <tr>
  54. <td align='center'>
  55. <input type="submit" value="Login">
  56. </td>
  57. </tr>
  58. <tr>
  59. <td align='center'>
  60. </td>
  61. </tr>
  62. </table>
  63. </form>

Creo que me estoy complicando bastante para lo que quiero hacer, tambien hay un par de SQL Injections por ahí... ¿Como lo podría mejorar? ¿Qué cambiarian del código? ¿Cómo lo puedo hacer más seguro?

cheers!


Título: Re: Ayuda con sistema login
Publicado por: Ertai en 27 Agosto 2008, 21:25 pm
Hola,

Si, hay cosas que puedes mejorar.

Primero codifica en md5 el password y luego haz la consulta. Sabrás si existe mirando en numero de filas devueltas por MySQL. Además no hace falta que hagas dos consultas, lo puedes hacer en una, busca el usuario introducido y su contraseña en md5.

Comprueba que el usuario tenga los caracteres A-Za-z0-9 o como desees antes de hacer la SQL y con el md5 del password ya no tendras problemas de inyecciones.

Otra cosa: tu campo en BDD de password es unn varchar de 20, y md5 esta codificado en 32, así que deberías cambiarlo.

Y mejor no uses el NULL para comparaciones a no ser que sepas que estas haciendo, pues PHP trata las variables muy diferente que en C o C++, usa mejor funciones del estilo empty(), isset(), etc...

Un saludo!