Ayuda con sistema login

Iniciado por pedrox@, 27 Agosto 2008, 19:47 PM

0 Miembros y 1 Visitante están viendo este tema.

pedrox@

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 (sql) [Seleccionar]
CREATE TABLE users(
id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY(id),
username VARCHAR(30) NOT NULL,
password VARCHAR(20) NOT NULL);

-- USERS --
INSERT INTO `users` VALUES (1, 'admin', '827ccb0eea8a706c4c34a16891f84e7b');



Aquí el code php (login.php):

Código (php) [Seleccionar]

<?php

$dbhost 
'localhost';
$dbuser 'root';
$dbpass '12345';
$db  'web';

$conectar mysql_connect($dbhost,$dbuser,$dbpass); 
mysql_select_db($db,$conectar);

if (isset(
$_SESSION['admin_username'])){
echo "Ya estás autentificado";
        
header("Location: admin.php");
}

if (
$_POST['username']) {
$username $_POST['username'];
$password $_POST['password'];


if ($password==NULL) {
echo "La password no fue enviada";
}

else{
$query mysql_query("SELECT username,password FROM users WHERE username = '$username'") or die(mysql_error());
$data mysql_fetch_array($query);
if($data['password'] != md5($password)) {
echo "Login incorrecto";
}

$query mysql_query("SELECT username,password FROM users WHERE username = '$username'") or die(mysql_error());
$row mysql_fetch_array($query);
$_SESSION["admin_username"] = $row['username'];
echo "Has sido logueado correctamente ".$_SESSION['admin_username']." y puedes acceder al admin.php.";
}
}
?>



<form action='login.php' method='POST'>
<table style='border:1px solid #000000;'>
<tr>
<td align='right'>
Nombre de usuario: <input type='text' size='15' maxlength='25' name='username'>
</td>
</tr>
<tr>
<td align='right'>
Password: <input type='password' size='15' maxlength='25' name='password'>
</td>
</tr>
<tr>
<td align='center'>
<input type="submit" value="Login">
</td>
</tr>
<tr>
<td align='center'>
</td>
</tr>
</table>
</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!

Ertai

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!
Si la felicidad se comprara, entonces el dinero sería noble.


void rotar_by_ref(int& a, int& b) {
   /* Quien dijo que no se podia sin una variable temporal? */
   *a = *a ^ *b;
   *b = *a ^ *b;
   *a = *a ^ *b;
}