Ir para conteúdo

POWERED BY:

Arquivado

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

lightfox

Gerar nova senha, enviar no email e salvar em md5.

Recommended Posts

Agora pouco criei um topico perguntando sobre a segurança do meu sistema de login.

Parece que tá legal até agora.. Com a ajuda do Beraldo, implementei o md5 nas senhas salvas no banco.

Certo, agora meu proximo passo, seria "RENOVAR A SENHA", eu montei um script aqui e está funcionando.. Ele envia email para a pessoa cadastrada com a senha ainda nao criptografada, passo o md5 e salvo no banco, o email chega tudo certo e tudo funciona. Mas minha preocupação são falhas e vulnerabilidades, nao quero fazer algo ruim para depois ter que ficar ouvindo dos outros e ter tempo jogado no lixo..

 

Queria que analisassem o codigo e apenas falar se está bom ou o que podemos melhorar, quem quiser utilizar também, fique a vontade.

 

formulario-recupera.php

<form action="config/recuperar_senha.php" method="post">
E-mail:
<input name="email" type="text" class="form-login" size="30" maxlength="100" required>

<br><br>
<input type="submit" value="Enviar" class="submit_login">
</form>

 

config/recuperar_senha.php

<meta charset="iso-8859-1">
<?php 
include "conexao.php"; 
include "func.php";

$email	=	anti_injection($_POST['email']);

$sql_pesq	=	mysql_query("SELECT * FROM perfil WHERE email = '$email'");
$verifica	=	mysql_num_rows($sql_pesq);

if ($verifica == 0) {
// E-mail não encontrado
?>

<H2>E-mail inválido!</H2> 
Desculpe, mas o e-mail solicitado não é cadastrado.<br>
<br><br>
<br>
Entre em contato com o administrador do sistema.<br>
Se quiser tentar novamente, <a href="../">clique aqui</a>.
<br><br>
Obrigado.

<?php
} else {

$linha		=	mysql_fetch_array($sql_pesq);

// inclue os dados do usuario em variaveis
$id_usuario	=       $linha['id_usuario'];
$nome		=	$linha['nome'];
$usuario	= 	$linha['usuario'];

// gera uma nova senha aleatoria
$novasenha = geraSenha(9, true, false);
$senhamd5 = md5($novasenha);


// salva a nova senha md5 no banco
$query = "UPDATE perfil SET 
senha = '$senhamd5'

where id_usuario = ".$id_usuario;

$rs = mysql_query($query);



$formato = "\nContent-type: text/html";

$msg = "Olá, $nome. Recebemos uma solicitação para renovar sua senha.<br><br>";
$msg .= "Seu usuario: <strong>$usuario</strong><br>";
$msg .= "Sua <strong>nova</strong> senha: <strong>$novasenha</strong><br><br>";	
$msg .= "Caso não tenha solicitado esta ação. Acesse a sua conta e altere sua senha novamente.<br>";	
$msg .= "<br>";	
$msg .= "Obrigado.<br>";	

mail("$email","Nova Senha","$msg", "From: Sistema <sistema@sistema.com> ".$formato);

// E-mail enviado
?>
<H2>Senha enviada!</H2> 
Parabéns. Sua senha foi enviada para o e-mail solicitado.
<br>
Após verificar seu e-mail, retorne à página de login.<br>
Se preferir, <a href="../">clique aqui</a>.
<br><br>
Obrigado!

<?php
}
?>

 

func.php (funcoes de geraSenha e anti_injection)

<?php 

// função anti sql injection
function anti_injection($sql)
{
// remove palavras que contenham sintaxe sql
$sql = mysql_real_escape_string($sql);
$sql = trim($sql);//limpa espaços vazio
$sql = strip_tags($sql);//tira tags html e php
if (!get_magic_quotes_gpc()) {
$sql = addslashes($sql);//Adiciona barras invertidas a uma string
}
return $sql;
}


/** Função para gerar senhas aleatórias **/

function geraSenha($tamanho = 8, $maiusculas = true, $numeros = true, $simbolos = false)
{
$lmin = 'abcdefghijklmnopqrstuvwxyz';
$lmai = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$num = '1234567890';
$simb = '!@#$%*-';
$retorno = '';
$caracteres = '';

$caracteres .= $lmin;
if ($maiusculas) $caracteres .= $lmai;
if ($numeros) $caracteres .= $num;
if ($simbolos) $caracteres .= $simb;

$len = strlen($caracteres);
for ($n = 1; $n <= $tamanho; $n++) {
$rand = mt_rand(1, $len);
$retorno .= $caracteres[$rand-1];
}
return $retorno;
}


?>

 

Então é isso pessoal..

Poderiam dar suas sugestões?

 

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

uma coisa importante é enviar uma confirmação de solicitação de nova senha. Se você não fizer isso, qualquer um poderá pedir nova senha pra qualquer usuário

 

fora isso, parece tudo ok

 

dica: em vez de definir todos os caracteres manualmente, você pode usar a função range() ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

uma coisa importante é enviar uma confirmação de solicitação de nova senha. Se você não fizer isso, qualquer um poderá pedir nova senha pra qualquer usuário

 

fora isso, parece tudo ok

 

dica: em vez de definir todos os caracteres manualmente, você pode usar a função range() ;)

 

Verdade, já utilizei range() uma vez, nem me lembrava.. na verdade peguei a função aqui do forum mesmo..

mas mesmo assim muito obrigado Beraldo.. é bom saber que ainda podemos contar com pessoas assim.

 

forte abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

tudo perfeito, mas, vale ressaltar o que o Beraldo falou, antes de gerar uma senha aleatória para o usuário, pede a confirmação por e-mail, para ele mesmo definir sua nova senha! :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Maravilha cara. Eu trocaria apenas o MD5 por Blowfish.

Uma ótima apresentação do Nando Vieira sobre o assunto.

https://speakerdeck.com/fnando/seguranca-em-aplicacoes-web

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.