lightfox 7 Denunciar post Postado Julho 21, 2012 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
Beraldo 864 Denunciar post Postado Julho 21, 2012 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
lightfox 7 Denunciar post Postado Julho 22, 2012 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
joaopaulonarciso 0 Denunciar post Postado Agosto 26, 2014 Além dessas páginas, há alguma configuração do email? Compartilhar este post Link para o post Compartilhar em outros sites
victorqueiroz 34 Denunciar post Postado Agosto 26, 2014 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
Marlon Pacheco 132 Denunciar post Postado Agosto 26, 2014 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