Ayuda con recuperacion de password

hamedm Seguir

Gamma
Programador
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Desde
7 Ene 2013
Mensajes
193
Hola Forobetanos,

Estaba editando mi sitio, pero lo que pasa, es que me esta fallando una parte, la cual es Timers-Pagina Oficial de Programacion de Hamed y Ardila, ingreso el email que es hamedmohseni@hotmail.com, luego me manda la url, acceso al pass.php, cuando quiero cambiar la password, me dice que no existe ese email.

Aqui les muestro el codigo de recuperar_contrasena.php:
PHP:
<div class="login">
<form id="form1" name="form1" method="post" action="recuperar_contrasena.php">
  Tu email<br />
  <input type="text" name="mail" id="mail" />
  <br />
  <br />
<input type="submit" name="button" id="button" value="Recuperar" />
</form>
</div>
</section>
<?php
if($_POST['button']){
	if($_POST['mail']){
		
		$mail = htmlentities($_POST['mail']);
		
		$link = mysql_connect ($ip, $user, $pass);
                mysql_select_db($bd,$link);
		
		$queEmp = "SELECT * FROM usuarios WHERE email='$mail'";
		$resEmp = mysql_query($queEmp, $link) or die(mysql_error());
		$totEmp = mysql_num_rows($resEmp);
		if($totEmp == 0){
		echo '<div style="border-radius:3px;padding:10px;background:#eb5d5d;border:1px solid red;color:#f5f5f5;text-shadow:1px 1px #444;width:310px;margin:0 auto;text-align:center;margin-top:10px;">El mail ingresado no existe</div>';
		exit();
		}		
		
		$row = mysql_fetch_assoc($resEmp);
		$hash = md5(md5($row['nick']).md5($row['password']));

		$headers .= "From:Recuperar password <recuperarcontrasena@sabzgoltab.com>\r\n";  
		$message = "Para recuperar tu contraseña dar click en la url de abajo.
		http://www.timers.com.co/hamed/pass.php?id=".$hash."&mail=".$mail."";
		
		if (mail($mail,"Recuperar password",$message,$headers)){
		echo '<div style="border-radius:3px;padding:10px;background:#eb5d5d;border:1px solid red;color:#f5f5f5;text-shadow:1px 1px #444;width:310px;margin:0 auto;text-align:center;margin-top:10px;">Se te envio un link a tu mail para cambiar la password</div>';
		}
	}
}
}else{header('Location: index.php');}
?>
<?php 
include('footer.php');
?>

y aqui tienen el codigo del pass.php
PHP:
<form id="form1" name="form1" method="post" action="pass.php?id=<?=$id?>&mail=<?=$mail?>">
  Nueva contrase&ntilde;a<br />
  <input type="text" name="contrasena" />
  <br />
  <br />
<input type="submit" name="button" id="button" value="Guardar" />
</form>
</div>
</section>
<?
$id = htmlentities($_GET['id']);
$mail = htmlentities($_GET['mail']);
$contrasena = md5($_POST['contrasena']);
if($_POST['button']){
	if(isset($id) && isset($mail)){
		$link = mysql_connect ($ip, $user, $pass);
                        mysql_select_db($bd,$link);
		
		$queEmp = "SELECT * FROM usuarios WHERE email='$mail'";
		$resEmp = mysql_query($queEmp, $link) or die(mysql_error());
		$totEmp = mysql_num_rows($resEmp);
		if($totEmp == 0){
		echo '<div style="border-radius:3px;padding:10px;background:#eb5d5d;border:1px solid red;color:#f5f5f5;text-shadow:1px 1px #444;width:310px;margin:0 auto;text-align:center;margin-top:10px;">El mail ingresado no existe</div>';
		exit();
		}
		
		$row = mysql_fetch_assoc($resEmp);
		$hash = md5(md5($row['nick']).md5($row['password']));
		
		if($hash == $id){
		$sql = "UPDATE usuarios SET password='".$contrasena."' WHERE email='$mail'";
		mysql_query($sql,$link);
		echo '<div style="border-radius:3px;padding:10px;background:#eb5d5d;border:1px solid red;color:#f5f5f5;text-shadow:1px 1px #444;width:310px;margin:0 auto;text-align:center;margin-top:10px;">Contrase&ntilde;a cambiada correctamente</div>';
		exit();			
		}
	}
}
}
?>

Espero su ayuda, Muchas Gracias
 

Praox

VIP
Gamma
SEO
Verificación en dos pasos activada
Verificado por Whatsapp
¡Ha verificado su Paypal!
Verificado por Binance
Suscripción a IA
Desde
25 Jun 2012
Mensajes
433
Me parece que el problema está en que htmlentities(); se aplica en dos ocasiones y eso es lo que está causando el problema.

En pass.php, prueba a cambiar $mail = htmlentities($_GET['mail']); por $mail = $_GET['mail'];. Por cierto, te recomendaría que revisaras la seguridad de esto más adelante, contra inyecciones SQL.

Un saludo.
 

hamedm

Gamma
Programador
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Desde
7 Ene 2013
Mensajes
193
Sigue apareciendo el email ingresado no existe
 

Praox

VIP
Gamma
SEO
Verificación en dos pasos activada
Verificado por Whatsapp
¡Ha verificado su Paypal!
Verificado por Binance
Suscripción a IA
Desde
25 Jun 2012
Mensajes
433
Sigue apareciendo el email ingresado no existe

¿Podrías pasarme la tabla .sql? Así puedo probar con mayor facilidad en mi host local.

Saludos :encouragement:
 

Tinroad

Alfa
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Desde
24 Ago 2008
Mensajes
17
en recuperar contraseña haz un echo de la variable mail luego de htmlentities y verifica que siga siendo lo que pusiste (que no se haya modificado por un tema de codificacion) y si ese valor existe en la tabla ya que el resto parece estar correcto, saludos
 

zcriptz

1
Ómicron
Programador
Verificación en dos pasos activada
Verificado por Whatsapp
Suscripción a IA
Desde
26 Mar 2013
Mensajes
4.621
Parece que usas htmlentities para evitar inyecciones...

Te recomiendo usar
PHP:
mysql_real_escape_string($variable);


___

Ahora a tu problema...

Esta bastante sencillo, el problema fue que tomas las variables despues de ponerlas en el formulario...

Asi seria el nuevo codigo que si funcionaria:

PHP:
<?
$link = mysql_connect ($ip, $user, $pass); 
mysql_select_db($bd,$link);

$mensaje = '';
$id = mysql_real_escape_string($_GET['id']); 
$mail = mysql_real_escape_string($_GET['mail']); 
$contrasena = md5($_POST['contrasena']); 
if($_POST['button']){ 
    if(isset($id) && isset($mail)){ 
        $queEmp = "SELECT * FROM usuarios WHERE email='$mail'"; 
        $resEmp = mysql_query($queEmp, $link) or die(mysql_error()); 
        $totEmp = mysql_num_rows($resEmp); 
        if($totEmp == 0){ 
             $mensaje = '<div style="border-radius:3px;padding:10px;background:#eb5d5d;border:1px solid red;color:#f5f5f5;text-shadow:1px 1px #444;width:310px;margin:0 auto;text-align:center;margin-top:10px;">El mail ingresado no existe</div>';
        } 
         
        $row = mysql_fetch_assoc($resEmp); 
        $hash = md5(md5($row['nick']).md5($row['password'])); 
         
        if($hash == $id){ 
             $sql = "UPDATE usuarios SET password='".$contrasena."' WHERE email='$mail'"; 
             mysql_query($sql,$link); 
             $mensaje = '<div style="border-radius:3px;padding:10px;background:#eb5d5d;border:1px solid red;color:#f5f5f5;text-shadow:1px 1px #444;width:310px;margin:0 auto;text-align:center;margin-top:10px;">Contrase&ntilde;a cambiada correctamente</div>'; 
        } 
    } 
}
}
?>
<form id="form1" name="form1" method="post" action="pass.php?id=<?=$id?>&mail=<?=$mail?>"> 
  Nueva contrase&ntilde;a<br /> 
  <input type="text" name="contrasena" /> 
  <br /> 
  <br /> 
<input type="submit" name="button" id="button" value="Guardar" /> 
</form> 
</div> 
</section> 
<?=$mensaje?>

______

Me debes un pancho y una gaseosa
 
Última edición:

hamedm

Gamma
Programador
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Desde
7 Ene 2013
Mensajes
193
Si, porque en donde dice email en recuperacion contraseña, me pide mi email, y si no pongo hamedmohseni@hotmail.com(ya existe en la base de datos), no funcionaria, ya que es la unica, ademas porque sì me manda el email pero cuando me llega, abro el url y me pida que cambie, y pongo enter, dice que no existe tal email
 

Praox

VIP
Gamma
SEO
Verificación en dos pasos activada
Verificado por Whatsapp
¡Ha verificado su Paypal!
Verificado por Binance
Suscripción a IA
Desde
25 Jun 2012
Mensajes
433
Si, porque en donde dice email en recuperacion contraseña, me pide mi email, y si no pongo hamedmohseni@hotmail.com(ya existe en la base de datos), no funcionaria, ya que es la unica, ademas porque sì me manda el email pero cuando me llega, abro el url y me pida que cambie, y pongo enter, dice que no existe tal email

Otra posible falla, ¿has comprobado que no hayas confundido la selección de la tabla en mysql_select_db?

Saludos :encouragement:
 

zcriptz

1
Ómicron
Programador
Verificación en dos pasos activada
Verificado por Whatsapp
Suscripción a IA
Desde
26 Mar 2013
Mensajes
4.621

¿Estas seguro que colocaste el código que te pase?

Parece que seguis tomando las variables despues de ponerlas en el formulario, me entedes?

O sea haces algo como esto

PHP:
echo $variable;

$variable = 'hola';

Crees que va a imprimir hola, pero no lo va a hacer porque la declaraste después...
 

Lopezito

Zeta
Diseñador
Verificación en dos pasos activada
Verificado por Whatsapp
Desde
13 Dic 2011
Mensajes
1.515
Bueno, creo que vamos a lo esencial, php.net <- buenos manuales de php.

Segundo, en pass.php no cargas los get's antes del formulario por lo tanto

Insertar CODE, HTML o PHP:
<form id="form1" name="form1" method="post" action="pass.php?id=<?=$id?>&mail=<?=$mail?>">

Dirá en el código de fuente:

Insertar CODE, HTML o PHP:
<form id="form1" name="form1" method="post" action="pass.php?id=&mail=">

Para ello debes cargas los gets antes del formulario seteando las varialbes $id y $mail.

U otra, podes fijarte en error_log, si hay un error de php.

Pero bueno, primero leete un manual de php, sin ofender.

Un saludo! :encouragement:

---------- Post agregado el 23-dic-2013 hora: 04:01 ----------

Revisando el código que te alcanzó [MENTION=42233]zcriptz[/MENTION]

Cuando abrís la condición de $totEmp == 0 luego no haces un else por si no es 0 el resultado de la variable. Puede ser que el problema esté en $hash == $id. Deberías de hacer un echo a esas 2 variables antes de la condición para saber que valor tiene cada una.

Un saludo! :encouragement:
 
Última edición:

zcriptz

1
Ómicron
Programador
Verificación en dos pasos activada
Verificado por Whatsapp
Suscripción a IA
Desde
26 Mar 2013
Mensajes
4.621
Bueno, creo que vamos a lo esencial, php.net <- buenos manuales de php.

Segundo, en pass.php no cargas los get's antes del formulario por lo tanto

Insertar CODE, HTML o PHP:
<form id="form1" name="form1" method="post" action="pass.php?id=<?=$id?>&mail=<?=$mail?>">

Dirá en el código de fuente:

Insertar CODE, HTML o PHP:
<form id="form1" name="form1" method="post" action="pass.php?id=&mail=">

Para ello debes cargas los gets antes del formulario seteando las varialbes $id y $mail.

U otra, podes fijarte en error_log, si hay un error de php.

Pero bueno, primero leete un manual de php, sin ofender.

Un saludo! :encouragement:

---------- Post agregado el 23-dic-2013 hora: 04:01 ----------

Revisando el código que te alcanzó [MENTION=42233]zcriptz[/MENTION]

Cuando abrís la condición de $totEmp == 0 luego no haces un else por si no es 0 el resultado de la variable. Puede ser que el problema esté en $hash == $id. Deberías de hacer un echo a esas 2 variables antes de la condición para saber que valor tiene cada una.

Un saludo! :encouragement:

En lo de $totEmp fue error mio, el de el "frena" el codigo con un exit, yo lo saque para no frenarlo ya que no llega a cargar el formulario, pero es verdad deberia haber un else, asi que este es el correcto:

PHP:
<?
$link = mysql_connect ($ip, $user, $pass); 
mysql_select_db($bd,$link);

$mensaje = '';
$id = mysql_real_escape_string($_GET['id']); 
$mail = mysql_real_escape_string($_GET['mail']); 
$contrasena = md5($_POST['contrasena']); 
if($_POST['button']){ 
    if(isset($id) && isset($mail)){ 
        $queEmp = "SELECT * FROM usuarios WHERE email='$mail'"; 
        $resEmp = mysql_query($queEmp, $link) or die(mysql_error()); 
        $totEmp = mysql_num_rows($resEmp);

         $row = mysql_fetch_assoc($resEmp); 
         $hash = md5(md5($row['nick']).md5($row['password'])); 
 
        if($totEmp == 0){ 
             $mensaje = '<div style="border-radius:3px;padding:10px;background:#eb5d5d;border:1px solid red;color:#f5f5f5;text-shadow:1px 1px #444;width:310px;margin:0 auto;text-align:center;margin-top:10px;">El mail ingresado no existe</div>';
        }elseif($hash == $id){
             $sql = "UPDATE usuarios SET password='".$contrasena."' WHERE email='$mail'"; 
             mysql_query($sql,$link); 
             $mensaje = '<div style="border-radius:3px;padding:10px;background:#eb5d5d;border:1px solid red;color:#f5f5f5;text-shadow:1px 1px #444;width:310px;margin:0 auto;text-align:center;margin-top:10px;">Contrase&ntilde;a cambiada correctamente</div>'; 
        }else{
             $mensaje = 'Hash erroneo';
        }
    } 
}
}
?>
<form id="form1" name="form1" method="post" action="pass.php?id=<?=$id?>&mail=<?=$mail?>"> 
  Nueva contrase&ntilde;a<br /> 
  <input type="text" name="contrasena" /> 
  <br /> 
  <br /> 
<input type="submit" name="button" id="button" value="Guardar" /> 
</form> 
</div> 
</section> 
<?=$mensaje?>
 

hamedm

Gamma
Programador
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Desde
7 Ene 2013
Mensajes
193
Listo Muchas Gracias Tanto a Lopezito Como zcriptz por ayudarme, ya pude, ademas le agrege una opcion de confirmar contraseña.
Lopezito, trata de ser mas pacifico.
Muchas Gracias, espero que les sirva a otras personas
 
Arriba