[Tutorial] Cambiar password aleatoriamente y UPDATE a la DB [Xt3mP]

Iniciado por Xt3mP, Marzo 19, 2010, 01:21:11 AM

Tema anterior - Siguiente tema

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

Marzo 19, 2010, 01:21:11 AM Ultima modificación: Marzo 27, 2014, 06:11:57 PM por Expermicid
Hola ¿Qué tal? Esto que les mostraré como hacer es para cuando olviden la contraseña en su sistema de usuario puedan recuperarla aleatoriamente, en cambio si la contraseña no está encriptada ó tiene un encriptado two way (en dos sentidos de/codificación) pues no ocuparán esto.

Esto lo hice por que ayer que trabajaba en el MC Habbix v1.0, pues las contraseñas las encripto en sha1, y dije ¿Y si se les olvidan la password? entonces recorde que sha1 y md5 son one way, osea no se podrán hacer a la inversa, así que lo que harémos será:

·Darle un UPDATE a la base de datos con al nueva contraseña.
·Escojer una nueva contraseña.
·Encriptarla nuevamente en sha1.
·Envíarla por correo al usuario.

Comenzarémos por crear nuestra tabla llamada users:
Código: php

CREATE TABLE users (
id int(10) auto_increment,
user varchar(255) NOT NULL,
pass varchar(255) NOT NULL,
nick varchar(255) NOT NULL,
habbo varchar(255) NOT NULL,
mail varchar(255) NOT NULL,
PRIMARY KEY (id)
)


Una vez creado esto harémos un archivo PHP llamado recordar.html con 3 casillas de texto de la siguiente forma:
Código: html5

<html><head><title>Recordar pass</title></head><body>
<form action="recordar.php" method="post">
Usuario:<input type="text" id="user" name="user" size="15"><br>
Nick:<input type="text" id="nick" name="habbo" size="15"><br>
Habbo:<input type="text" id="habbo" name="nick" size="15"><br>
<input type="submit" value="Recordar" id="recordar">
</form></body></html>


Ya deberíamos tener 3 casillas de texto llamadas de izquierda a derecha: user, nick y habbo.

Procederémos a crear el config.php que es al que le haremos llamado mediante el recordar.php:

Código: php

<?php
$dbhost="localhost"; //Host del mysql
$dbuser="USUARIO"; //Usuario del mysql
$dbpass="PASS"; //Password del mysql
$db="BASE DE DATOS"; //Base de datos del mysql
//Nos conectamos y seleccionamos la base de datos del mysql
mysql_connect("$dbhost","$dbuser","$dbpass");
mysql_select_db("$db");
?>


Este config.php modifiquen los datos de ingreso si no no les funcionará, procederémos a crear el recordar.php:

Primero comprobarémos el valor de las casillas de texto y le indicamos unas condicionales en dado caso que no tengan valor:
Código: php

<?php
if ($_POST['user'] == "" or $_POST['nick'] == "" or $_POST['habbo'] == ""){ // Comprobamos que las casillas de texto no tengan valor.
echo 'Te faltaron rellenar campos.';
echo "<meta http-equiv='Refresh' content='2;url=recordar.html'>"; // Si estan vacias los redireccionamos a recordar.html
}else{
include ('config.php'); // Incluimos la conexion de la base de datos
$user = $_POST['user']; // Obtenemos el valor de la casilla user
$nick = $_POST['nick']; // Obtenemos el valor de la casilla nick
$habbo = $_POST['habbo']; // Obtenemos el valor de la casilla habbo
?>


Despúes comprobamos que los valores de las casillas de texto existen en la base de datos, en la tabla users de la siguiente forma:

Código: php

<?php
$usuarios = mysql_query("SELECT * FROM users WHERE user='$user' and nick='$nick' and habbo='$habbo' ");
?>


Una vez hecho esto, comprobamos que si se llevo a cabo la petición haga el array para generar la password aleatoria:

Código: php

<?php
if($user_ok = mysql_fetch_array($usuarios)){
$aleatoria = array(1 => 'a83je05', 2 => 'dk59dj3', 3 => 'a0sk3h4', 4 => 'a03jdy7', 5 => 'a904k5t', 6 => 'sj59edh', 7 => '9dj5yas', 8 => '4fdo5ks', 9 => 'sk49dj4', 10 => 'i4k04kd');
$pass = rand(1,10);
?>


Aquí le metemos arrays a la variable aleatoria con arrays numéricos, ya que el rand solo acepta valores numéricos, por lo tanto el rand escojerá un número del 1 al 10 en este caso, y al momento de llamar al array escojerá un valor aleatorio.
Despúes, encriptarémos la contraseña  y harémos el UPDATE a la base de datos así:

Código: php

<?php
$pass_new = sha1($aleatoria[$pass]); //Encriptamos en sha1
$SQL = "UPDATE users SET pass='".$pass_new."' WHERE id='".$user_ok['id']."'"; // Hacemos el UPDATE
mysql_query($SQL);
?>


Aquí encriptamos la contraseña en sha1 y hacemos el update sustituyendo el valor del campo pass original por el de la contraseña aleatoria encriptada en sha1, $user_ok['id'] tiene el valor del ID de fila de los datos que ingresamos anteriormente, en este caso los de la casilal de texto.

Ahora harémos una carta donde tendrá la nueva contraseña así y le pondrémos los headers del formáto de envío de corre electrónico:

Código: php

<?php
$new_pass = '
MC Habbix v1.0 - Recordar contraseña.
Tu usuario es: '.$user_ok['user'].'
Su nueva contraseña es: '.$aleatoria[$pass].'

----------------------

MC Habbix v1.0 ~ Administrators.';
$asunto = "MC Habbix v1.0 ~ New Pass";
$headers = "MIME-Version: 1.0\n";
$headers .= "Content-type: text/plain; charset=iso-8859-1\n";
$headers .= "From: MC Habbix v1.0 <[email protected]>\n";
$headers .= "To: ".$user_ok['habbo']." <".$user_ok['mail'].">\n";
$headers .= "Reply-To: [email protected]\n";
?>


Aquí pues mostrarémos lo que sería el usuario y la nueva contraseña, si se dan cuenta la contraseña es $aleatoria[$pass], ¿Por qué? Por que aleatoria son arrays y para llamar a un array se hace de esta forma:

$aleatoria[0]
$aleatoria[1]
Etc, dependiendo cuantos valores tengan, entonces a $pass tiene la función rand que nos genera un número aleatoriamente, por lo tanto al elejir aleatoriamente y poner $aleatoria[$pass] está elijiendo un número al azar y dependiendo el número que se elija es la nueva contraseña que tendrá.

Ahora simplemente enviarémos el correo así:
Código: php

<?php
mail($user_ok['mail'],$asunto,$new_pass,$headers);
?>


En donde $user_ok['mail'] es el del usuario, el asunto es el que anteriormente escribimos en la variable $asunto, $new_pass es la carta con los datos, y $headers es el formáto de envío.

Ahora pondrémos por último unas condicionales y cerrarémos todas las llaves así:

Código: php

<?php
echo 'Se ha envíado tu nueva contraseña a tu dirección de registro.';
echo "<meta http-equiv='Refresh' content='2;url=chat.php'>";
        }else{
        echo 'Datos no encontrados.';
        echo "<meta http-equiv='Refresh' content='2;url=recordar.html'>";
            }
        }
    }
}
?>


Y esto sería todo, aquí les dejo el código final:

Código: php

<?php
if ($_POST['user'] == "" or $_POST['nick'] == "" or $_POST['habbo'] == ""){ // Comprobamos que las casillas de texto no tengan valor.
echo 'Te faltaron rellenar campos.';
echo "<meta http-equiv='Refresh' content='2;url=recordar.html'>"; // Si estan vacias los redireccionamos a recordar.html
}else{
include ('config.php'); // Incluimos la conexion de la base de datos
$user = $_POST['user']; // Obtenemos el valor de la casilla user
$nick = $_POST['nick']; // Obtenemos el valor de la casilla nick
$habbo = $_POST['habbo']; // Obtenemos el valor de la casilla habbo
$usuarios = mysql_query("SELECT * FROM users WHERE user='$user' and nick='$nick' and habbo='$habbo' "); // Checamos que los datos existan
if($user_ok = mysql_fetch_array($usuarios)){
$aleatoria = array(1 => 'a83je05', 2 => 'dk59dj3', 3 => 'a0sk3h4', 4 => 'a03jdy7', 5 => 'a904k5t', 6 => 'sj59edh', 7 => '9dj5yas', 8 => '4fdo5ks', 9 => 'sk49dj4', 10 => 'i4k04kd'); // Ponemos frases cualquiera en el array de aleatoria
$pass = rand(1,10); // Generamos un numero al azar del 1 al 10
$pass_new = sha1($aleatoria[$pass]); // Encriptamos pass en sha1
$SQL = "UPDATE users SET pass='".$pass_new."' WHERE id='".$user_ok['id']."'";
mysql_query($SQL);
$new_pass = '
MC Habbix v1.0 - Recordar contraseña.
Tu usuario es: '.$user_ok['user'].'
Su nueva contraseña es: '.$aleatoria[$pass].'

----------------------

MC Habbix v1.0 ~ Administrators.';
$asunto = "MC Habbix v1.0 ~ New Pass"; // Asunto del correo
$headers = "MIME-Version: 1.0\n";
$headers .= "Content-type: text/plain; charset=iso-8859-1\n";
$headers .= "From: MC Habbix v1.0 <[email protected]>\n";// Correo del remitente
$headers .= "To: ".$user_ok['habbo']." <".$user_ok['mail'].">\n"; // Correo del destinatario
$headers .= "Reply-To: [email protected]\n"; // A quien responder
mail($user_ok['mail'],$asunto,$new_pass,$headers); // Enviamos correo
echo 'Se ha envíado tu nueva contraseña a tu dirección de registro.'; // Si el correo se envio correctamente
echo "<meta http-equiv='Refresh' content='2;url=chat.php'>";
        }else{ // Si los datos no existen
        echo 'Datos no encontrados.';
        echo "<meta http-equiv='Refresh' content='2;url=recordar.html'>";
        }
       }
     }
   }
?>


Suerte, cualquier duda ó corrección haganmela saber ya que modifiqué ciertos aspectos para mostrarselos.
Cada vez que me das Karma me motivas