Foros del Web » Programando para Internet » PHP »

Cookies y MD5 en login

Estas en el tema de Cookies y MD5 en login en el foro de PHP en Foros del Web. Hola Tengo la necesidad de hacer un sistema de registro y autentificación con login y passwd. Buscando por la red, encontré partes de código que, ...
  #1 (permalink)  
Antiguo 08/05/2008, 08:50
 
Fecha de Ingreso: mayo-2008
Mensajes: 5
Antigüedad: 15 años, 11 meses
Puntos: 0
Cookies y MD5 en login

Hola
Tengo la necesidad de hacer un sistema de registro y autentificación con login y passwd. Buscando por la red, encontré partes de código que, supuestamente le funcionan al autor, pero en mi caso me encontré con un problema (el único hasta ahora).

1º) La parte del registro de usuario funciona bien: Esto es, encripta el password.
2º) La parte del login es la que no funciona.

A ver si me podéis echar una mano:

Este archivo se llama verifica.php y es quien debe hacer la validación con la BD una vez que introducimos el login y passwd en el formulario y pulsamos sobre "aceptar" para que se haga la autentificación. Creo que aqui es donde esta el problema, pero a ver si alguien sabe específicamente donde.

Código:
<?php
include('config.php');
$user=stripslashes($_POST['username']);
$pass=stripslashes($_POST['password']);
$query = mysql_query("SELECT password FROM users WHERE username = '$user' limit 1") or die(mysql_error());
$data = mysql_fetch_array($query);
if($data['password'] == md5($pass)) {
$_SESSION['user'] = $user;
$nonce = md5(uniqid(rand(), true));
setcookie("nonce", $nonce, time()+3600*12);
$query = mysql_query("UPDATE users SET nonce = '$nonce' WHERE username = '$user'");
echo "login ok";
exit();
} else {
echo "fail";
exit();
}

?>
Aqui pongo también el archivo registro.php que es quien hace el ALTA en la base de datos con el nombre, passwd, etc del nuevo usuario (Este funciona bien).

Código:
<?php
include('config.php');
if (isset($_POST["username"])) {
$user = $_POST["username"];
$pass = $_POST["password"];
$cpass = $_POST["cpassword"];
$email = $_POST["email"];
if($user==NULL|$pass==NULL|$cpass==NULL|$email==NULL) {
echo "Algún campo está vacio.";
}else{
if($pass!=$cpass) {
echo "Las contraseñas no coinciden";
}else{
$checkuser = mysql_query("SELECT username FROM users WHERE username='$user'");
$username_exist = mysql_num_rows($checkuser);

$checkemail = mysql_query("SELECT email FROM users WHERE email='$email'");
$email_exist = mysql_num_rows($checkemail);

if ($email_exist>0|$username_exist>0) {
echo "EL nombre de usuario o la cuenta de correo estan ya en uso";
}else{
$epass = md5($password);
$nonce = md5(uniqid(rand(), true));
$query = "INSERT INTO users (username, password, email, nonce) VALUES('$user','$epass','$email','$nonce')";
mysql_query($query) or die(mysql_error());
echo "El usuario $user ha sido registrado de manera satisfactoria."
Gracias
  #2 (permalink)  
Antiguo 08/05/2008, 09:00
Avatar de Carlojas  
Fecha de Ingreso: junio-2007
Ubicación: Shikasta
Mensajes: 1.272
Antigüedad: 16 años, 10 meses
Puntos: 49
Re: Cookies y MD5 en login

Porque dices que no te funciona, cual es el error que te da? esto aparte de que si utilizas variables de sesión al inicio de tus páginas debes de añadir session_start()



Saludos.
  #3 (permalink)  
Antiguo 08/05/2008, 09:14
 
Fecha de Ingreso: mayo-2008
Mensajes: 5
Antigüedad: 15 años, 11 meses
Puntos: 0
Re: Cookies y MD5 en login

No funciona porque me envía siempre al mensaje de "fail", lo cual quiere decir que no está validando bien. La opción de session_start(); se incluye en el archivo config.php, que es este:

Código:
<?php
$dbhost='localhost';
$dbusername='root';
$dbuserpass='mipassword';
$dbname='inventario';
mysql_connect ($dbhost, $dbusername, $dbuserpass);
mysql_select_db($dbname) or die('Cannot select database');
session_start();
?>
Saludos
  #4 (permalink)  
Antiguo 08/05/2008, 10:54
 
Fecha de Ingreso: mayo-2008
Mensajes: 5
Antigüedad: 15 años, 11 meses
Puntos: 0
Re: Cookies y MD5 en login

Mejor pongo todo el código, para evitar especular y andar adivinando:

Archivo config.php con los datos de conexion a la bd.

Código:
<?php
$dbhost='localhost';
$dbusername='root';
$dbuserpass='mipassword';
$dbname='inventario';
mysql_connect ($dbhost, $dbusername, $dbuserpass);
mysql_select_db($dbname) or die('Cannot select database');
session_start();
?>
Archivo creatabla.php para crear los campos necesarios dentro de la bd.

Código:
<?php
include("config.php");
$query = 'CREATE TABLE users(
id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY(id),
username VARCHAR(30) NOT NULL,
password VARCHAR(20) NOT NULL,
email VARCHAR(40) NOT NULL,
nonce VARCHAR(64) NOT NULL)';
$result = mysql_query($query) or die(mysql_error());
echo "!Tabla creada!";
?>
Archivo registrar.php que incluye el formulario para añadir usuarios a la bd. (Apunta a registro.php, que es quien hace el trabajo).

Código:
<?php
include_once("config.php");
include("function.php");
if(is_login()) {
echo "Conectado";
}else{
?>
<html>
<head>
  <title>ALTA DE USUARIO</title>
</head>
<body>
<div style="text-align: center;"><img style="width: 220px; height: 200px;" alt="" src="images/telmex.jpg"><br>
<big><span style="font-weight: bold;">Alta de
usuario en la base de datos<br>
<br clear="all">
</span></big></div>
<table style="width: 100%; text-align: left; margin-left: auto; margin-right: auto;" border="0" cellpadding="2" cellspacing="2">
  <tbody>
    <tr>
      <td>
      <div style="text-align: center;">
      <form action="registro.php" method="post">
        <table style="border: 1px solid rgb(0, 0, 0); text-align: left; margin-left: auto; margin-right: auto;">
          <tbody>
           <tr>
              <td align="right">Nombre de usuario: <input size="15" maxlength="25" name="username" type="text"> </td>
            </tr>
            <tr>
             <td align="right">Password: <input size="15" maxlength="25" name="password" type="password"> </td>
            </tr>
            <tr>
              <td align="right">Repite Password: <input size="15" maxlength="25" name="cpassword" type="password"> </td>
            </tr>
            <tr>
              <td align="right">Email: <input size="15" maxlength="25" name="email" type="text"> </td>
            </tr>
            <tr>
              <td align="center"> <input value="Registrar" type="submit"></td>
            </tr>
          </tbody>
        </table>
      </form>
      </div>
      </td>
    </tr>
  </tbody>
</table>
<br>
</body>
</html>
<?php
}
?>

Archivo registro.php, que es invocado por el formulario anterior y realiza el alta de usuario en la bd.

Código:
<?php
include("config.php");
if (isset($_POST["username"])) {
$user = stripslashes($_POST["username"]);
$pass = stripslashes($_POST["password"]);
$cpass = stripslashes($_POST["cpassword"]);
$email = stripslashes($_POST["email"]);
if($user==NULL|$pass==NULL|$cpass==NULL|$email==NULL) {
echo "Algún campo está vacio.";
}else{
if($pass!=$cpass) {
echo "Las contraseñas no coinciden";
}else{
$checkuser = mysql_query("SELECT username FROM users WHERE username='$user'");
$username_exist = mysql_num_rows($checkuser);

$checkemail = mysql_query("SELECT email FROM users WHERE email='$email'");
$email_exist = mysql_num_rows($checkemail);

if ($email_exist>0|$username_exist>0) {
echo "EL nombre de usuario o la cuenta de correo estan ya en uso";
}else{
$epass = md5($password);
$nonce = md5(uniqid(rand(), true));
$query = "INSERT INTO users (username, password, email, nonce) VALUES('$user','$epass','$email','$nonce')";
mysql_query($query) or die(mysql_error());
echo "El usuario $user ha sido registrado de manera satisfactoria.";
}
}
}
}
?>
Archivo index.php que consiste en el formulario donde los usuarios van a realizar el login.

Código:
<?php
include_once("config.php");
include("function.php");
if(is_login()) {
	echo "Conectado";
}else{
?>
<html>
<head>
  <title>Login</title>
</head>
<body>
<div style="text-align: center;"><img style="width: 220px; height: 200px;" alt="" src="images/telmex.jpg"><br>
<big><span style="font-weight: bold;">Identificaci&oacute;n requerida</span></big></div>
<table style="width: 100%; text-align: left; margin-left: auto; margin-right: auto;" border="0" cellpadding="2" cellspacing="2">
  <tbody>
    <tr>
      <td><br>
      <div style="text-align: center;">
      <form action="verifica.php" method="post">
        <table style="border: 1px solid rgb(0, 0, 0); text-align: left; margin-left: auto; margin-right: auto;">
          <tbody>
            <tr>
              <td align="right">
Nombre de usuario: <input size="15" maxlength="25" name="username" type="text">
              </td>
            </tr>
            <tr>
              <td align="right">
Password: <input size="15" maxlength="25" name="password" type="password">
              </td>
            </tr>
            <tr>
              <td align="center">
              <input value="Login" type="submit"></td>
            </tr>
          </tbody>
        </table>
      </form>
      </div>
      <div style="text-align: center;"></div>
      </td>
    </tr>
  </tbody>
</table>
<br>
</body>
</html>
<?php
}
?>
Archivo verifica.php, que es quien realiza la verificación con la bd y es invocado por el formulario anterior.

Código:
<?php
include("config.php");
$user=stripslashes($_POST['username']);
$pass=stripslashes($_POST['password']);
$query = mysql_query("SELECT password FROM users WHERE username = '$user' limit 1") or die(mysql_error());
$data = mysql_fetch_array($query);
if($data['password'] == md5($pass)) {
$_SESSION['user'] = $user;
$nonce = md5(uniqid(rand(), true));
setcookie('nonce', $nonce, time() + 7776000, '/');
$query = mysql_query("UPDATE users SET nonce = '$nonce' WHERE username = '$user'");
echo "login ok";
exit();
} else {
echo "fail";
exit();
}

?
Archivo function.php que sirve para verificar si un usuario tiene alguna cookie de sesion en su pc y evitar tener que realizar el login nuevamente.

Código:
<?php
include("config.php");
function is_login() {
   // Comprobamos si existe sesión
   if(isset($_SESSION['user'])) return true;
   //Comprobamos si hay cookie, si está bien y le asignamos una sesión
   if(isset($_COOKIE['nonce'])) {
      $cookie = mysql_real_escape_string($_COOKIE['nonce']);
      $query = mysql_query("SELECT * FROM users WHERE nonce='$cookie'") or die(mysql_error());
      $data = mysql_fetch_array($query);
      if(isset($data['username'])) {
         $_SESSION['user'] = $data['username'];
         return true;
      }
   }
   return false;
}
?>
Y esto es todo. Como dije, el registro de usuarios se realiza bien, pero al hacer login con el user y passwd siempre me sale el mensaje de "fail" que se incluye al final del archivo verifica.php.
  #5 (permalink)  
Antiguo 08/05/2008, 11:03
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Re: Cookies y MD5 en login

lo ke pasa es ke estas usando md5 cuando tu campo password es varchar.... jamas los vas a igualar asi, debes agregar en tu SELECT del password, con nose... MD5(password) AS pass ((dentro del SQL)) para ke te devuelve el hash con el ke seguramente haras la comparacion correcta... sino, intenta eliminando el md5() de tu comparacion PHP, ya que no has guardado el password como tal, md5... o mas bien, cuando uses INSERT... procura guardar el password ya con el md5() para evitar tales detalles.... vale?

sino me ekivoco, son tres formas de solucionarle... o ke
  #6 (permalink)  
Antiguo 08/05/2008, 11:53
 
Fecha de Ingreso: mayo-2008
Mensajes: 5
Antigüedad: 15 años, 11 meses
Puntos: 0
Re: Cookies y MD5 en login

No entiendo

En el archivo registro.php está este codigo:

Código:
$epass = md5($password);
$nonce = md5(uniqid(rand(), true));
$query = "INSERT INTO users (username, password, email, nonce) VALUES('$user','$epass','$email','$nonce')";
mysql_query($query) or die(mysql_error());
y en la bd despues de dar un alta de usuario el password aparece encriptado, lo cual quiere decir que si está guardando el password encriptado.

Sobre el campo password como VARCHAR, entiendo que no debe de haber problema para encriptar.

En fin, apenas empiezo con php y no me quedaron claras tus sugerencias, aunque obviamente agradezco tu tiempo pero ¿podrías concretar un poco más tus sugerencias? ¿Algún ejemplo?

Gracias
  #7 (permalink)  
Antiguo 08/05/2008, 12:00
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Re: Cookies y MD5 en login

bien, llevas buena logica... pero, igualmente es una duda...

EDITO: md5 produce 32 caracteres...

ahora, intenta imprimiedo... $data['password'] y md5($pass) en tu archivo: verifica.php nos cuentas que saLE...
  #8 (permalink)  
Antiguo 08/05/2008, 12:31
 
Fecha de Ingreso: mayo-2008
Mensajes: 5
Antigüedad: 15 años, 11 meses
Puntos: 0
Re: Cookies y MD5 en login

Aquí esta la solución que se me ocurrió en base a una de tus indicaciones:

En el archivo verifica.php añadi una segunda variable pass, quedando así:

Código:
<?php
include("config.php");
$user=stripslashes($_POST['username']);
$pass=stripslashes($_POST['password']);
$pass=md5($pass);
En la última línea está la clave.
Con eso ya puedo loguearme correctamente.

Muchas gracias.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 01:52.