Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Alberto Beagá

Recuperar Senha ...

Recommended Posts

Como faço para criar um "recuperador de senha".

 

O usuário solicita e recebe ela em seu e-mail.

Compartilhar este post


Link para o post
Compartilhar em outros sites

formulário.

<form name="form1" method="post" action="recupera_senha.php">
<font face=Tahoma size=2 color=black><br>
<div align="center"><b></b> 
 <input name="email" type="text1" id="email" placeholder="Lembrar sua senha?" size="40" autofocus required />
<input name="recupera" type="hidden" id="recupera" value="recupera" />
<input type="submit" name="Submit" value="Ir">
</p>
</form>

Aquivo recuperar_senha.php

<?php
//conexão com o banco de dados
include("config.php");

//pega a variavel via post
$email=$_POST['email'];
//busca no banco o usuario com o email
$sql=mysql_query("SELECT * FROM usuarios WHERE email = '$email'");
//conta quantos tem
$verifica=mysql_num_rows($sql);
// caso haja mais de um cadastrado...
if($verifica == 1){
//fazemos um while para coletarmos as outras informações do usuario
//tais como o nome e a senha
while($Row_email = mysql_fetch_array($sql)){
                $nome = $Row_email['nome'];
                $senha = $Row_email['senha'];
                }

//envia o email para a pessoa juntamente com seu nome e sua senha
$msg="Olá $nome, você solicitou a recuperação de senha para o sistema xxxxxx\n \n";
$msg.="Sua senha é: $senha";

mail($email, "Recuperação de senha", $msg);

//alerta que o email foi enviado e o redireciona para outra página
echo"<script>alert('Senha enviada por e-mail, verifique sua caixa de mensagens ou sua caixa de spans.'),window.open('index.php','_self')</script>";
}
//caso contrário
else{
//lhe informa que o seu e-mail não está cadastrado no banco de dados
echo"<script>alert('E-mail não cadastrado em nosso sistema, caso não se lembre do email cadastrado, entre em contato conosco.'),window.open('index.php','_self')</script>";

}
?> 

No include é o seu arquivo de conexão com o banco.

 

Esse é um recuperar senha simples, pois ele trabalha com o serviço de disparo de email de sua hospedagem, lembrando que muitas hospedagens desabilitam essa recurso. E por ser assim por vezes pode parar na caixa de spam do usuário. Então alertar para ele verificar lá também.

 

Outro ponto, isso só é possível se você não trabalha com senhas criptografadas.

 

Mas é muito simples e prático de se implementar, e bem funcional

Compartilhar este post


Link para o post
Compartilhar em outros sites

A quem possa melhorar, vi o vídeo postado pelo omor.

 

Não sei porque, mas com a conexão com o banco dele, sempre diz que o link já está expirado, Então usei um arquivo de conexão config.php. Dessa forma resolveu. Não quebrei a cabeça para resolver. E também melhor passar para mysqli todo código.

 

Também alterei para gravar em sha1, já que estava gravando sem criptografia.

 

Mas o probleminha dele, se não colocar nenhum email ou um inexistente e ficar pedindo para recuperar, ele vai gravando as solicitações no banco e enviando emails para o email administrador. Creio que deve colocar ali algo que o email não foi encontrado por exemplo. Não sei. Quem puder mostrar a solução. Abaixo os códigos do vídeo.

 

index.php

<html>
<?php
	date_default_timezone_set("America/Sao_Paulo");

ini_set('smtp_port', '587');
	include "config.php";
?>
	<head>
		<title>Recuperar Senha</title>
	</head>

	<body>
		<?php
		if(isset($_POST['acao']) && $_POST['acao'] == 'recuperar'):
			$email = strip_tags(filter_input(INPUT_POST, 'emailRecupera', FILTER_SANITIZE_STRING));

			$verificar = mysql_query("SELECT `email` FROM `usuarios` WHERE email = '$email'");
			if(mysql_num_rows($verificar) == 1){
				$codigo = base64_encode($email);
				$data_expirar = date('Y-m-d H:i:s', strtotime('+1 day'));

				$mensagem = '<p>Recebemos uma tentativa de recuperação de senha para este e-mail, caso não tenha sido você,
					desconsidere este e-mail, caso contrário clique no link abaixo<br /> 
					<a href="http://www.seusite.com.br/recuperar.php?codigo='.$codigo.'">Recuperar Senha</a></p>';
				$email_remetente = 'aviso@seusite.com.br';

				$headers = "MIME-Version: 1.1\n";
				$headers .= "Content-type: text/html; charset=iso-8859-1\n";
				$headers .= "From: $email_remetente\n";
				$headers .= "Return-Path: $email_remetente\n"; 
				$headers .= "Reply-To: $email\n"; 

				$inserir = mysql_query("INSERT INTO `codigos` SET codigo = '$codigo', data = '$data_expirar'");
				if($inserir){
					if(mail("$email", "Assunto", "$mensagem", $headers, "-f$email_remetente")){
						echo 'Enviamos um e-mail com um link para recuperação de senha, para o endereço de e-mail informado!';
					}
				}
			}
		endif;
		?>
		<form action="" method="post" enctype="multipart/form-data">
			<?php
				if(isset($_GET['recuperar']) && $_GET['recuperar'] == 'sim'){
			?>
				<input type="text" placeholder="Digite seu Email" name="emailRecupera" size="30" value="" />
				<input type="hidden" name="acao" value="recuperar" />
				<input type="submit" value="Recuperar Senha" />
				<a href="index.php">Voltar</a>
			<?php }else{?>
				<input type="text" name="emailLoga" value="" />
				<input type="password" name="senhaLoga" value="" />
				<input type="hidden" name="acao" value="logar" />
				<input type="submit" value="Logar" />
				<center><a href="?recuperar=sim">Esqueceu sua senha?</a>
			<?php }?>
		</form>
	</body>
</html>

Arquivo recuperar.php

<?php
	include "config.php";


if(isset($_GET['codigo'])){
	$codigo = $_GET['codigo'];
	$email_codigo = base64_decode($codigo);

	$selecionar = mysql_query("SELECT * FROM `codigos` WHERE codigo = '$codigo' AND data > NOW()");
	if(mysql_num_rows($selecionar) >= 1){
		if(isset($_POST['acao']) && $_POST['acao'] == 'mudar'){
		$nova_senha = sha1($_POST['novasenha']);

			$atualizar = mysql_query("UPDATE `usuarios` SET `senha` = '$nova_senha' WHERE `email` = '$email_codigo'");
			if($atualizar){
				$mudar = mysql_query("DELETE FROM `codigos` WHERE codigo = '$codigo'");
				echo 'A senha foi modificada com sucesso!';
			}
		}
?>

<h1>Digite a senha nova</h1>
<form action="" method="post" enctype="multipart/form-data">
<input type="password" name="novasenha" value="" />

<input type="hidden" name="acao" value="mudar" />
<input type=

<?php
	}else{
		echo '<h1>Desculpe mais este link ja expirou!</h1>';
	}
}
?>
"submit" value="Mudar Senha" />
</form>

Compartilhar este post


Link para o post
Compartilhar em outros sites

faz um while na verificação do email no banco depois faz um if assim

 

if($email == "" or $email != (da variavel linha email que vc fizer no while)){

echo 'você deve colocar seu email';

}else{

executa o codigo

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tentei desta forma, Quando ele acha o email ele da o aviso corretamente, mas caso eu digite um email inexistente, ele apenas volta para eu redigitar, mas não dando mensagem alguma.

$inserir = mysql_query("INSERT INTO `codigos` SET codigo = '$codigo', data = '$data_expirar'");
				if($inserir){
					if(mail("$email", "Assunto", "$mensagem", $headers, "-f$email_remetente")){
						echo "Email enviado. Verifique sua caixa de entrada ou spam";	}else {  echo "Email não encontrado";
					}
				}
			}
		endif;
		?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vi essa solução aqui, ainda estou tentando corrigir alguns erros, mas pelo visto é mais seguro.

 

http://wiki.portugal-a-programar.pt/dev_web:php:recuperacao_password

 

O exemplo do vídeo postado pelo omor tem uma falha. um exemplo aqui: Se você tem um email xxx@xxx.com, ele gera o link do site seguido da codificação: www.seusite.com.br/recuperar/recuperar.php?codigo=x1x1x1x1x1x1

 

Isso apenas um exemplo. Então se a pessoa amanhã pede uma solicitação novamente, ele manda exatamente o mesmo link www.seusite.com.br/recuperar/recuperar.php?codigo=x1x1x1x1x1x1

 

O código dele se baseia na codificação do email

 

Já este que postei o link, ele mesmo sendo o mesmo email para recuperação, manda um código aleatório sempre, nunca o mesmo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Da forma que eu te falei pra fazer, ele vai comparar se o campo email é vazio e compara se o

Email digitado e igual ao email do banco de dados, caso.seja diferente ou vazio da a mensagem,

Caso contrário executa o codigo

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu tenho esse.codigo aqui e ele não envia se não tiver email

Errado. Se um brincalhão ficar apertando o botão sem digitar email algum, ele vai enviando email de erros ao email indicado como o remente.

 

Se a pessoa digitar um email inexiste, aí sim ele não vai enviar nada. Nada que um autofocus alí não resolva para a pessoa não disparar sem email.

 

O outro problema foi o que falei. Ele sempre gera o mesmo código para o mesmo email. Isso é falha grande. Pois basta saber o email de alguém, gerar a codificação do email de base64 em qualquer lugar, depois copiar e colar junto com a extensão do site. Se troca a senha de qualquer pessoa.

 

Esse recuperar senha torna a segurança mais frágil do que você ter uma senha sem criptografia no banco. Não precisa de sql injection nem nada, só saber o email de alguém, e o caminho está aberto para alterar a senha.

 

Apenas vou tentar ajustar ele aqui, a opção do link que postei é melhor no quesito segurança, mas está com alguns erros. Mas ele gera sempre códigos diferentes, ficando impossibilitado de a pessoa copiar um código antigo,

 

Pegar a ideia do link que postei e melhorar a do vídeo que está muito falho.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Claro que é falha. Se ele gera o mesmo código sempre e eu de posse de seu email que é coisa simples, apenas entro no site que quero, mando recuperar a senha com seu email e BINGO!!!. ele não está mais expirado. Voltou a ficar liberado.

 

Coloco o mesmo código e altero sua senha. Acho que você ainda não visualizou a falha gritante.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, acho que você não entendeu ou ainda não percebeu a falha. Ele gera uma criptografia para o código pelo email

 

Supondo que eu sou um professor de uma escola, aonde tem vários alunos tentando entrar na área do professor.

 

Um professor tem o email xxx@gmail.com, Se este professor esquecer a senha e precisar a redefinir, ele vai no lembrar senha. Criado o código e enviando para o email do professor.

 

Sendo a página de redefinição: www.seusite.com.br/recuperar/recuperar.php? ele vai adicionar o código criado do email criptografado. Que para o email xxx@gmail.com é: eHh4QGdtYWlsLmNvbQ==

 

sendo assim o link vai ser esse para redefinir a senha: www.seusite.com.br/recuperar/recuperar.php?eHh4QGdtYWlsLmNvbQ==

 

Após trocada a senha o link expira. "Grandes coisas" Sendo o link já conhecido e qualquer aluno sabendo o email do professor que é uma coisa que é tremendamente natural. Este aluno vai a qualquer site converter o email: xxx@gmail.com na base64. Logo vai dar eHh4QGdtYWlsLmNvbQ== De posse disso o aluno então vai na página de login, digita o email do professor para lembrar senha e pronto. O link voltou a ficar ativo.

 

Agora o aluno apenas cola no navegador o endereço padrão: www.seusite.com.br/recuperar/recuperar.php? + o código da base64 referente ao email do professor: eHh4QGdtYWlsLmNvbQ== Pronto, ele já alterou a senha e tem acesso.

 

Não precisa sql injection, habilidades de hacker e nem tentar invadir nada ou ficar testando senhas. Apenas saber o email do professor e mais nada. Porque ele sempre vai gerar o mesmo código para o mesmo email sempre.

 

No link que passei e testei aqui, ele gera a página padrão, mas ele cria códigos aleatórios sempre, mesmo sendo o mesmo email. Isso faz que um código gerado nunca se repita, então ninguém vai conseguir descobrir facilmente qual código foi criado, já que ele não é uma criptografia do email existente.

 

E o que adianta ele expirar por data neste exemplo do vídeo, se você o reativa a hora que quiser mandando recuperar a senha? Ele não expira na prática, já que quando você manda lembrar a senha ele cria exatamente o mesmo código novamente para aquele email.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, poste um exemplo.

 

Ou quem puder mostrar um exemplo com este recuperar senha do vídeo. Ajudaria muitos, Fiz pequenas mudanças e até penso em aproveitar ele, mas essa falha não tem como.

 

Esse vídeo circula com várias pessoas o mostrando, mas acho que ninguém se atentou a essa falha dele gerar sempre o mesmo link para o mesmo email.

 

Então não existe dele expirar o link, já que lembrando a senha ele volta a ativar exatamente o mesmo link.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Será que tem alguém que da uma luz neste tópico com os erros encontrados? Pois esse lembrar senha é muito indicado neste fórum, mas agora que relatei os erros ninguém se manifesta.

 

Dei uma melhorada. Assim ele checa algumas funções e também se o email não está cadastrado.

echo '<p>Foi enviado um e-mail para o seu endereço para redefinição da senha.</p>';
} else {
echo '<p><center>Houve um erro ao enviar o email (o servidor suporta a função mail?)</p>';
 
      }
 
// Apenas para testar o link, no caso do e-mail falhar
echo '';
 
} else {
echo '<p><center>Não foi possível gerar o endereço único</p>';
      }
 } else {
 echo '<p>Esse Email não foi encontrado</p>';
      }
endif;

Ainda não sei a solução para gerar códigos aleatórios para este recuperar senha do vídeo. Também seria interessante para dificultar, no lembrar senha solicitar o login, assim dificultando um pouco a reativação do link, que neste caso está falho por gerar sempre o mesmo código para o mesmo email.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.