Ver Mensaje Individual
  #4 (permalink)  
Antiguo 08/05/2008, 10:54
guajolote
 
Fecha de Ingreso: mayo-2008
Mensajes: 5
Antigüedad: 16 años
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.