Foros del Web » Programando para Internet » PHP »

Pedido

Estas en el tema de Pedido en el foro de PHP en Foros del Web. Hola a todos! Estoy creando una web y casi esta terminada, pero me he puesto a pensar que necesito un sistema para recuperar contraseña. Y ...
  #1 (permalink)  
Antiguo 02/05/2015, 09:01
(Desactivado)
 
Fecha de Ingreso: febrero-2015
Mensajes: 32
Antigüedad: 9 años, 2 meses
Puntos: 0
Pedido

Hola a todos!

Estoy creando una web y casi esta terminada, pero me he puesto a pensar que necesito un sistema para recuperar contraseña.

Y queria saber si podrian darme uno simple, Que solo coloques el e-mail y te mande un codigo al mismo, luego clickeas el link que diria algo como "recuperar contraseña"
y en el formulario colocas el codigo y la nueva contraseña.

Algo asi de simple, es que aun no se crear en php.

Saludos y gracias!
  #2 (permalink)  
Antiguo 02/05/2015, 10:45
 
Fecha de Ingreso: junio-2009
Mensajes: 101
Antigüedad: 14 años, 10 meses
Puntos: 13
Respuesta: Pedido

No es tan simple como crees. De todas formas te lo haré de forma rápida y sin detallar mucho

Código PHP:
<?php
class Account {
    
//[...]
    
    
public static function valid_email($email){
        if(
preg_match('/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,5})$/'$email)){
            return 
true;
        }else{
            return 
false;
        }
    }
    
    public static function 
email_exists($email){
        
/*
            Aqui iría la consulta a tu base de datos de usuarios comprobando que exista algun usuario con ese email.
            Algo como:
        */
        
$q mysql_query("SELECT email FROM users WHERE email='".mysql_real_escape_string($email)."'");
        if(
mysql_num_rows($q) == 1){
            return 
true;
        }
        return 
false;
    }
    
    public static function 
send_mail($to,$subject,$message){
        
#SMTP: Librería para enviar correos electrónicos en PHP
        
require('smtp/class.phpmailer.php');
        require(
'smtp/class.smtp.php');

        
$mail = new PHPMailer();
        
$mail->IsSMTP(); 
        
$mail->Host "";    //Servidor SMTP
        
$mail->From "";    //Correo electrónico enviante
        
$mail->FromName "";//Nombre enviante
        
$mail->Subject $subject;
        
$mail->MsgHTML($message);
        
$mail->AddAddress($to"");    //La segunda opción es para especificar el "nombre" del destinatario. Pues poner su nombre de usuario.
        
$mail->SMTPAuth true;
        
$mail->Username "";//Correo electrónico enviante
        
$mail->Password "";//Contraseña correo electrónico enviante
        
if(!$mail->Send()) {
            return 
false;
        }else{
            return 
true;
        }
    }
    
    public static function 
send_forgotpassword_email($email){
        
$email trim($email);
        if(empty(
$email))
            return array(
false,"Debes rellenar todos los campos");
        if(!
self::valid_email($email))
            return array(
false,"El correo electrónico especificado es inválido");
        if(!
self::email_exists($email))
            return array(
false,"El correo electrónico especificado no corresponde a ningún usuario");
        
        
//código para cambiar su contraseña. Si no te quieres complicar puede ser su email encriptado:
        
$token md5($email); //md5() -> 32 caracteres : numero hex
        
$subject sprintf("%s: Recuperar Contraseña","MIPAGINA"); //MIPAGINA: Recuperar Contraseña
        
$message sprintf("Hola %s,<br/>""nombre_de_usuario");
        
$message .= sprintf("Has solicitado recuperar tu cuenta de %s, para hacerlo necesitarás el siguiente código:<br/> %s<br/>","MIPAGINA",$token);
        
$message .= "Un saludo.";
        if(
self::send_mail($email,$subject,$message)){
            return array(
true,"Mensaje enviado con éxito. Comprueba tu bandeja de entrada");
        }else{
            return array(
false,"Ha ocurrido un error. Por favor, inténtalo de nuevo.");
        }
        
    }
    
    public static function 
encrypt($password){
        return 
Sha1(md5($password));    //O la forma que utilices para encryptar contraseñas.
    
}
    
    public static function 
change_password($token,$pass1,$pass2,$email){
        if(
$pass1!=$pass2)
            return array(
false,"La contraseña y su verificación no coinciden");
        if(
$token!=md5($_POST['fgtpw_email']))
            return array(
false,"El token introducido es inválido");
        
        if(
mysql_query("UPDATE users SET password='".self::encrypt($pass1)."' WHERE email='".mysql_real_escape_string($email)."'")){ //mysql_real_escape_string() no sería necesario si pasas el email de forma segura
            
return array(true,"Contraseña cambiada con éxito.");
        }else{
            return array(
false,"Ha ocurrido un error. Por favor, inténtalo de nuevo.");
        }
    }
}
    if(isset(
$_POST['fgtpw_token']) && isset($_POST['fgtpw_pw1']) && isset($_POST['fgtpw_pw2']) && isset($_POST['fgtpw_email'])){
        
$result Account::change_password($_POST['fgtpw_token'],$_POST['fgtpw_pw1'],$_POST['fgtpw_pw2']);
        if(
$result[0]){
            echo 
$result[1];
        }else{
            echo 
"Error:".$result[1];
        }
    }else if(isset(
$_POST['fgtpw_email'])){
        
$result Account::send_forgotpassword_email($_POST['fgtpw_email']);
        if(
$result[0]){
            
//Correo enviado, Nuevos datos (?)
?>    
            <div id="result"><?php echo $result[1];?></div>
            <form action="#" method="post">
                <input type="text" placeholder="Token" name="fgtpw_token" />
                <input type="password" placeholder="Nueva Contraseña" name="fgtpw_pw1" />
                <input type="password" placeholder="Repite tu Contraseña" name="fgtpw_pw2" />
                <input type="hidden" name="fgtpw_email" value="<?php echo $_POST['fgtpw_email'];?>" /> <!-- Esto no es una buena forma de pasar el email, esto es solo un ejemplo, podrias hacerlo con una variable de sesión $_SESSION -->
                <input type="submit" value="Enviar" />
            </form>
<?php
        
}else{
            
//Error enviando el mensaje
?>    
            <div id="result">Error: <?php echo $result[1]; ?></div>
            <form action="#" method="post">
                <input type="text" placeholder="Correo Electrónico" name="fgtpw_email" />
                <input type="submit" value="Enviar" />
            </form>
<?php
        
}
    }else{
        
//Main Screen
?>
        <form action="#" method="post">
            <input type="text" placeholder="Correo Electrónico" name="fgtpw_email" />
            <input type="submit" value="Enviar" />
        </form>
<?php
    
}
?>
Seguramente no es ni la mejor manera ni la más optima y habré pasado por alto alguna cosa pero no concretas demasiado, lo he hecho de forma rápida y para lo que pagas... jajajaja

Un saludo, espero que te sirva al menos como algo orientativo
  #3 (permalink)  
Antiguo 02/05/2015, 11:19
(Desactivado)
 
Fecha de Ingreso: febrero-2015
Mensajes: 32
Antigüedad: 9 años, 2 meses
Puntos: 0
Respuesta: Pedido

Me tira este error:


Código PHP:
Warningsession_start() [function.session-start]: Cannot send session cache limiter headers already sent (output started at C:AppServwwwreset.php:1in C:AppServwwwconfigs.php on line 5

Warning
mysql_num_rows(): supplied argument is not a valid MySQL result resource in C:AppServwwwreset.php on line 20
Error
El correo electrónico especificado no corresponde a ningún usuario 

Y este es el config mio:

Código PHP:
<?php
session_save_path
('phpsessions');
if (!isset(
$_SESSION)) 
{
  
session_start();
}

/*||||||||||||||||||||||||||||||||||||||||*/
/*|||||||The Language Configuration|||||||*/
/*|||||||||||DO NOT TOUCH THIS||||||||||||*/
/*||||||||||||||||||||||||||||||||||||||||*/
$lang = &$_SESSION['Local'];
$lang $_GET['Local'];
switch (
$lang)
{
    case 
'en-us' :
        include (
"lang/en-us.php");
        break;
    case 
'ro-ro' :
        include (
"lang/ro-ro.php");
        break;
    case 
'en-gb' :
        include (
"lang/en-gb.php");
        break;
    case 
'it-it' :
        include (
"lang/it-it.php");
        break;
    case 
'de-de' :
        include (
"lang/de-de.php");
        break;
    case 
'bu-bu' :
        include (
"lang/bg-bg.php");
        break;
    case 
'es-es' :
        include (
"lang/es-es.php");
        break;
    case 
'es-mx' :
        include (
"lang/es-mx.php");
        break;
    case 
'gr-gr' :
        include (
"lang/gr-gr.php");
        break;
    case 
'ru-ru' :
        include (
"lang/ru-ru.php");
        break;
    case 
'zh-cn' :
        include (
"lang/zh-cn.php");
        break;
    case 
'zh-tw' :
        include (
"lang/zh-tw.php");
        break;
    case 
'fr-fr' :
        include (
"lang/fr-fr.php");
        break;         
    default :
        include (
"lang/en-us.php");
        
$lang 'en-es';
}
/*||||||||||||||||||||||||||||||||||||||||*/
/*||||||||The Server Configuration||||||||*/
/*||||||||||||||||||||||||||||||||||||||||*/
$serveraddress "tenebron-wow.servegame.com"// Your MySQL server address
$serveruser "root"// Your MySQL user
$serverpass "db3418"//Your MySQL password
$serverport    "3306"// Your MySQL Port
$donatadmin "db3418"// Your Donation Admin Password
$website['realm'] = "Set realmlist tenebron-wow.servegame.com"// You realm (Example: Set RealmList login.wowfailure.com)
/*||||||||||||||||||||||||||||||||||||||||*/
/*|||||||The Donation Configuration|||||||*/
/*||||||||||||||||||||||||||||||||||||||||*/
// Coming SOON!
/*||||||||||||||||||||||||||||||||||||||||*/
/*|||||||The Website Configuration||||||||*/
/*||||||||||||||||||||||||||||||||||||||||*/
$server_db "web"//Your website database
$server_adb "auth"//Your account database
$server_cdb "characters"//Your characters database
$server_cdb_2 "characters"//Your characters database
$server_wdb "world"//Your world database
$server_wdb_2 "world"//Your world database
$charTable 'characters'//Your Character Table!!
$name_realm1['realm'] = "Tenebron"//Your Realm Name 1
$name_realm2['realm'] = "Server_Name_2"//Your Realm Name 2
$realm_count '1'//number of realms
$charLimit '10'//Max characters to show on the page
$mysql_cod 'cp1251';
$website['title'] = "Tenebron-WoW"// Your Website Title
$website['slogan'] = "Un Nuevo Mundo"// Your Website Slogan.
$website['address'] = "http://tenebron-wow.servegame.com"// 'http://url/foldername/' or 'http://url/'
$website['root'] = "/"// '/' <- for root and '/foldername/' <- for any folder
/*||||||||||||||||||||||||||||||||||||||||*/
/*||||||||||||DO NOT EDIT BELOW|||||||||||*/
/*||||||||||||||||||||||||||||||||||||||||*/
/*||||||||||||DO NOT EDIT BELOW|||||||||||*/
/*||||||||||||||||||||||||||||||||||||||||*/
$connection_setup mysql_connect($serveraddress,$serveruser,$serverpass)or die(mysql_error());
mysql_select_db($server_db,$connection_setup)or die(mysql_error());

if(isset(
$_SESSION['username'])){
    
mysql_select_db($server_adb,$connection_setup)or die(mysql_error());
    
$username mysql_real_escape_string($_SESSION['username']);
    
$lbrspa mysql_query("SELECT * FROM account WHERE username = '".$username."'");
    
$account_information mysql_fetch_assoc($lbrspa);
    
mysql_select_db($server_db,$connection_setup)or die(mysql_error());
}
?>
<script type="text/javascript" src="http://static.wowhead.com/widgets/power.js"></script>

Última edición por dami5200; 02/05/2015 a las 11:26
  #4 (permalink)  
Antiguo 02/05/2015, 12:00
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 10 meses
Puntos: 379
Respuesta: Pedido

Cita:
Iniciado por dami5200 Ver Mensaje
Hola a todos!

Estoy creando una web y casi esta terminada, pero me he puesto a pensar que necesito un sistema para recuperar contraseña.

Y queria saber si podrian darme uno simple, Que solo coloques el e-mail y te mande un codigo al mismo, luego clickeas el link que diria algo como "recuperar contraseña"
y en el formulario colocas el codigo y la nueva contraseña.

Algo asi de simple, es que aun no se crear en php.

Saludos y gracias!
de verdad me hiciste el día con esto
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #5 (permalink)  
Antiguo 02/05/2015, 12:21
(Desactivado)
 
Fecha de Ingreso: febrero-2015
Mensajes: 32
Antigüedad: 9 años, 2 meses
Puntos: 0
Respuesta: Pedido

Cita:
Iniciado por hhs Ver Mensaje
de verdad me hiciste el día con esto
Mmmm, porque?

Acaso estoy pidiendo algo raro?
  #6 (permalink)  
Antiguo 02/05/2015, 14:01
 
Fecha de Ingreso: junio-2009
Mensajes: 101
Antigüedad: 14 años, 10 meses
Puntos: 13
Respuesta: Pedido

Cita:
Iniciado por dami5200 Ver Mensaje
Mmmm, porque?

Acaso estoy pidiendo algo raro?
No pero pides que te lo den todo hecho y no suele gustar. Me pillaste de buenas y por eso te lo hice :)

El error del session_start() es porque "session_start()" debe colocarse siempre en la primera linea del archivo:

Código PHP:
<?php
session_start
();

[...]

?>
El error de mysql_num_rows() viene porque tienes que hacer la consulta concreta a tu BD en la función que te hice para comprobar que el email estuviese registrado en la base de datos (Account::email_exists()). Obviamente yo no conozco tu base de datos y te lo puse de ejemplo, tendrás que hacer tú la consulta.


Te recomiendo que antes de ponerte a hacer cosas "tan avanzadas" aprendas más PHP

Un saludo
  #7 (permalink)  
Antiguo 02/05/2015, 16:22
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años
Puntos: 320
Respuesta: Pedido

¿Es en serio? Vamos, que algún moderador se apiade de esta pobre alma perdida y borre su mensaje antes de que alguien entre a su servidor y le borre todas las bases de datos.

Edito: Se que es algo que solo los mas avanzados (diría super expertos) conocen, así que te revelo un secreto sobre la seguridad informática: Nunca reveles el usuario, la clave, la url del servidor mysql, la clave del usuario root, el puerto que estas usando, tu clave maestra de administrador del sitio, los nombres de las bases de datos que tienes y el sitio web que las utiliza en un mensaje publico como este.
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios

Última edición por NSD; 02/05/2015 a las 16:27
  #8 (permalink)  
Antiguo 02/05/2015, 20:09
 
Fecha de Ingreso: junio-2009
Mensajes: 101
Antigüedad: 14 años, 10 meses
Puntos: 13
Respuesta: Pedido

Cita:
Iniciado por NSD Ver Mensaje
¿Es en serio? Vamos, que algún moderador se apiade de esta pobre alma perdida y borre su mensaje antes de que alguien entre a su servidor y le borre todas las bases de datos.

Edito: Se que es algo que solo los mas avanzados (diría super expertos) conocen, así que te revelo un secreto sobre la seguridad informática: Nunca reveles el usuario, la clave, la url del servidor mysql, la clave del usuario root, el puerto que estas usando, tu clave maestra de administrador del sitio, los nombres de las bases de datos que tienes y el sitio web que las utiliza en un mensaje publico como este.
Cierto, pobre, ni me habría fijado
  #9 (permalink)  
Antiguo 03/05/2015, 08:05
Avatar de NueveReinas  
Fecha de Ingreso: septiembre-2013
Ubicación: No tan Buenos Aires
Mensajes: 1.101
Antigüedad: 10 años, 7 meses
Puntos: 145
Respuesta: Pedido

Pues ya te han jodido, porque la web no carga
__________________
¿Te sirvió la respuesta? Deja un +1
  #10 (permalink)  
Antiguo 03/05/2015, 14:57
(Desactivado)
 
Fecha de Ingreso: febrero-2015
Mensajes: 32
Antigüedad: 9 años, 2 meses
Puntos: 0
Respuesta: Pedido

Cita:
Iniciado por NSD Ver Mensaje
¿Es en serio? Vamos, que algún moderador se apiade de esta pobre alma perdida y borre su mensaje antes de que alguien entre a [URL="http://tenebron-wow.servegame.com/phpmyadmin/"]su servidor [/URL] y le borre todas las bases de datos.

Edito: Se que es algo que solo los mas avanzados (diría super expertos) conocen, así que te revelo un secreto sobre la seguridad informática: Nunca reveles el usuario, la clave, la url del servidor mysql, la clave del usuario root, el puerto que estas usando, tu clave maestra de administrador del sitio, los nombres de las bases de datos que tienes y el sitio web que las utiliza en un mensaje publico como este.
No es nada importante que borren las bases, lo importo nuevamente ._.

Aparte que esto no es mas que algo temporal para poder editar la pagina :v
Cuando realmente la importe lo unico que tengo que cambiar es el pass :v
  #11 (permalink)  
Antiguo 03/05/2015, 15:53
Avatar de NueveReinas  
Fecha de Ingreso: septiembre-2013
Ubicación: No tan Buenos Aires
Mensajes: 1.101
Antigüedad: 10 años, 7 meses
Puntos: 145
Respuesta: Pedido

De todas formas, aunque puedas recuperar todo el sistema, yo no confiaría en un "desarrollador" que ponga los datos así nomás en cualquier web XD
__________________
¿Te sirvió la respuesta? Deja un +1
  #12 (permalink)  
Antiguo 04/05/2015, 06:07
 
Fecha de Ingreso: junio-2009
Mensajes: 101
Antigüedad: 14 años, 10 meses
Puntos: 13
Respuesta: Pedido

Cita:
Iniciado por NueveReinas Ver Mensaje
De todas formas, aunque puedas recuperar todo el sistema, yo no confiaría en un "desarrollador" que ponga los datos así nomás en cualquier web XD
Yo tampoco. Pero menos aún confiaría en un desarrollador que pide que le hagan un sistema para recuperar la contraseña
  #13 (permalink)  
Antiguo 04/05/2015, 20:17
(Desactivado)
 
Fecha de Ingreso: febrero-2015
Mensajes: 32
Antigüedad: 9 años, 2 meses
Puntos: 0
Respuesta: Pedido

Cita:
Iniciado por BanNsS1 Ver Mensaje
Yo tampoco. Pero menos aún confiaría en un desarrollador que pide que le hagan un sistema para recuperar la contraseña
Lo siento, por un segundo crei que era un foro de ayuda, no un foro donde los usuarios con antiguedad quien "robarte"
  #14 (permalink)  
Antiguo 04/05/2015, 20:55
Avatar de ArturoGallegos
Moderador
 
Fecha de Ingreso: febrero-2008
Ubicación: Morelia, México
Mensajes: 6.774
Antigüedad: 16 años, 2 meses
Puntos: 1146
Respuesta: Pedido

Jaja claro que es un foro de ayuda pero no lo confundas con el foro "muerete de ambre y regalame tu trabajo"
  #15 (permalink)  
Antiguo 05/05/2015, 02:09
Avatar de lauser
Moderator Unix/Linux
 
Fecha de Ingreso: julio-2013
Ubicación: Odessa (Ukrania)
Mensajes: 3.278
Antigüedad: 10 años, 9 meses
Puntos: 401
Respuesta: Pedido

Cita:
Iniciado por dami5200 Ver Mensaje
Lo siento, por un segundo crei que era un foro de ayuda, no un foro donde los usuarios con antiguedad quien "robarte"
Hasta donde yo se, nadie te robo nada. Todo lo contrario, se te ha evitado una perdida total.
__________________
Los usuarios que te responden, lo hacen altruistamente y sin ánimo de lucro con el único fin de ayudarte. Se paciente y agradecido.
-SOLOLINUX-
  #16 (permalink)  
Antiguo 05/05/2015, 06:22
Avatar de NueveReinas  
Fecha de Ingreso: septiembre-2013
Ubicación: No tan Buenos Aires
Mensajes: 1.101
Antigüedad: 10 años, 7 meses
Puntos: 145
Respuesta: Pedido

Cita:
Iniciado por dami5200 Ver Mensaje
Lo siento, por un segundo crei que era un foro de ayuda, no un foro donde los usuarios con antiguedad quien "robarte"
¿Quién te ha robado? Como dice lauser, NSD ha evitado que te echen a perder todo el trabajo.

Además, este foro lo puede visitar gente no registrada, por lo que el acceso completo a tus datos podría no haberte afectado ahora, sino dentro de un tiempo, ocasionando mayores pérdidas.
__________________
¿Te sirvió la respuesta? Deja un +1
  #17 (permalink)  
Antiguo 05/05/2015, 06:47
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Pedido

Cita:
Iniciado por dami5200 Ver Mensaje
Lo siento, por un segundo crei que era un foro de ayuda, no un foro donde los usuarios con antiguedad quien "robarte"
Si dejas la llave de tu casa colgada en un clavo, del lado de la calle, y con un cartel de neón diciendo "ESTA ES LA LLAVE DE ESTA CASA", difícilmente lo que suceda pueda considerarse "robo".
Además, es algo insultante que digas que nosotros vamos "robate" lo que tengas en esa base o host, simplemente porque te avisamos que estás metiendo la pata a lo grande.
Al menos agradece que te advertimos antes de seguir haciendolo, y que tu cliente no ha descubierto lo que hiciste. Yo dudaría que fuese tan comprensivo...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 05/05/2015 a las 06:59

Etiquetas: Ninguno
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.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:03.