Redefinir senha

16 respostas Resolvido
mysqlphp
R

Boa tarde
Tenho uma aplicação web feita em php7, e tudo estava a caminhar bem ate que me surgiu um problema
Na hora de redefinir senha, ele sempre fica me dando resultado negativo, eu li e reli meu código e ate agora nada.

Arquivo recovery:

// Incluindo arquivos
    include_once '../Controller/DatabaseConection.php';
    include_once '../Controller/CheckChave.php';
    include_once '../Controller/AlteracaoDeSenha.php';

    // Instanciando objetos
    $conecta = new DatabaseConection();
    $checkChave = new CheckChave();
    $alterarSenha = new AlteracaoDeSenha();

    // Recebendo paramentros pelo metodo post
    $email = $_POST['email'];
    $senhaNaoSegura = $_POST['senha'];
    $chave = $_POST['chave'];

    // Criptografando senhaNaoSegura
    $senha = password_hash($senhaNaoSegura, PASSWORD_BCRYPT, array('cost'=>12));

    // Atribuindo variaveis as funcoes
    $conexao = $conecta->Conectar();

    // Chamada de funcao validarChave()
    $verificacao = $checkChave->validarChave($conexao, $email, $chave);

    // Valida se a funcao validarChave() retornou com o id do usuario
    if($verificacao)
    {
        $alterarSenha->alterarSenha($conexao, $senha, $verificacao);
        header("Location: ../Index.html");
    }
    else
    {
        echo "<h1>Usuario não encontrado</h1>";
    }

Classe checkChave

class CheckChave
{
    function validarChave($conexao,$email, $chave)
    {
        // Realizando busca de email e senha no banco para validacao
        $query = mysqli_query($conexao, "SELECT * FROM usuarios WHERE email='$email'") or die(mysqli_error());

        // Captacao do resultado da consulta
        $contagem = mysqli_num_rows($query) or die(mysqli_error());

        //
        $array = mysqli_fetch_assoc($query) or die(mysqli_error());

        // Chave correta para efetuar a comparacao
        $chaveCorreta = sha1($array["senha"]);

        // Valida existencia do e-mail do banco de dados
        if($contagem > 0)
        {
            // Valida se a chave de acesso esta correta
            if ($chave == $chaveCorreta)
            {
                return $array["id"];
            }
        }
    }
}

Classe alteracaoDeSenha

class AlteracaoDeSenha
{
    function alterarSenha($conexao, $senha, $verificacao)
    {
        $query = mysqli_query($conexao, "UPDATE usuarios SET senha='$senha' WHERE id = '$verificacao'") or die(mysqli_error());
        return $query;
    }
}

para o usuario LostSoldier: alterei o cost de novo kkk, Tava demorando um tempinho para criptografar, mas eu mudei de todos

16 Respostas

L

O que você diz com resultado negativo?

A contagem não é maior que zero?

Apenas para confirmar, o arquivo que gera o hash, você está usando sha1 no campo de senha mesmo?

R

entao, ele fica dando usuario nao encontrado, a contagem e referente a o email encontrado no banco
ja o sha1 e o que eu faco pra gerar a chave de acesso, ele pega o campo senha ja criptografado no banco com bctypt e faz o sha1 em cima para gerar a chave

R

eu acho que tive algum progresso, tava fazendo um debug e percebi que ele nao estava conseguindo comparar as chaves

foi nessa funcao

function validarChave($conexao,$email, $chave)
    {
        echo "1, ";
        // Realizando busca de email e senha no banco para validacao
        $query = mysqli_query($conexao, "SELECT * FROM usuarios WHERE email='$email'") or die(mysqli_error());

        echo "2, ";
        //
        $array = mysqli_fetch_assoc($query) or die(mysqli_error());

        echo "3, ";
        // Chave correta para efetuar a comparacao
        $chaveCorreta = sha1($array["senha"]);

        echo "4, ";
        // Valida existencia do e-mail do banco de dados
        if(mysqli_num_rows($query) > 0)
        {
            echo "5, ";
            // Valida se a chave de acesso esta correta
            if ($chave == $chaveCorreta)
            {
                echo "6, ";
                return $array["id"];
            }
        }
    }
}

ele parou de executar no echo"5";

L

Estou imaginando… você disse ter mudado o custo novamente, mas… e no banco?

Reajustou todas as senhas com esse novo custo?

Já que a comparação está dando false, a única explicação é que o hash do banco, por ainda estar com custo 20 ou 25 ou qualquer coisa rsrs, ao comparar o novo custo gerado pela chave, vai dar diferença no sha1 depois…

R

Entao, eu dei um truncate na tabela, e todos os valores estao com bcrypt de cost 12
eu faco o sha1 pra gerar a chave

exemplo
a senha esta criptografada com o bcrypt com o cost 12
pra gerar a chave, eu pego a senha criptografada e faco um sha1 em cima dela. Na hora da comparacao eu faco a mesma coisa, pego a senha criptografada e faco um sha1 nela de novo e coloco o nome de $chaveCorreta, ai eu comparo as duas

L

Eu entendi todo o processo, por isso mesmo levantei a hipótese do custo na base ser diferente, isso ainda não resolveu?

Na linha do echo "5, ", antes do if, veja o que retornam…

echo '<pre>';
var_dump($chave);
var_dump($chaveCorreta);
echo '</pre>';
R

retorna isso
NULL
string(40) "2c7467ad5efd994da853e77187b3d2002bf88663

L

Sua chave não está chegando, por isso a diferença…

Como você está mandando o post para essa página?

R

as coias estao comecando a fazer sentido eu acho

to mandando por esse model

/ Incluindo arquivos
    include_once '../Controller/DatabaseConection.php';
    include_once '../Controller/CheckChave.php';
    include_once '../Controller/AlteracaoDeSenha.php';

    // Instanciando objetos
    $conecta = new DatabaseConection();
    $checkChave = new CheckChave();
    $alterarSenha = new AlteracaoDeSenha();

    // Recebendo paramentros pelo metodo post
    $email = $_POST['email'];
    $senhaNaoSegura = $_POST['senha'];
    $chave = $_POST['chave'];

    // Criptografando senhaNaoSegura
    $senha = password_hash($senhaNaoSegura, PASSWORD_BCRYPT, array('cost'=>12));

    // Atribuindo variaveis as funcoes
    $conexao = $conecta->Conectar();

    // Chamada de funcao validarChave()
    $verificacao = $checkChave->validarChave($conexao, $email, $chave);

    // Valida se a funcao validarChave() retornou com o id do usuario
    if($verificacao)
    {
        $alterarSenha->alterarSenha($conexao, $senha, $verificacao);
        header("Location: ../Index.html");
    }
    else
    {
        echo "<h1>Usuario não encontrado</h1>";
    }
L

Não cara, quero saber quem manda esse post, de onde está vindo?

$email = $_POST['email'];
$senhaNaoSegura = $_POST['senha'];
$chave = $_POST['chave'];

Precisa ser algum formulario, etc… além do mais, após essas linhas faça…

echo '<pre>';
var_dump($_POST);
echo '</pre>';

E outra, evite apagar suas mensagens, melhor editar, assim não polui o tópico, rsrsrs

R

ah ta, esquece e o sono
ta vindo dessa pagina feita em php

<!DOCTYPE html>
<html lang="pt-br">
    <head>
        <meta charset="UTF-8">
        <title>Recuperar Senha</title>
        <link rel="stylesheet" href="Css/Recovery.css">
    </head>
    <body>
    <!-- Div recuperar senha -->
    <div class="recupearSenha">
        <?php
        // Chave inicializa como vazia
        $chave = "";

        // Validando recebimento da chave
        if($_GET['chave'])
        {
            // Variavel chave recebe paramentro enviado por get "chave"
            $chave = $_GET["chave"];
            ?>
                <h1>Recupere sua senha</h1>
                <form method="post" action="../Model/Recovery.php">
                    <!-- Campo chave recebe paramentro enviado por get -->
                    <input type="hidden" name="chave" required="" value="<?php echo $chave ?>">

                    <!-- Campos para a redefinicao de senha -->
                    <input type="email" id="email" name="email" required="" autocomplete="off" spellcheck="false" placeholder="E-mail">
                    <br>
                    <input type="password" id="senha" name="senha" required="" placeholder="Nova Senha">
                    <br>
                    <input type="submit" id="recuperar" value="Recuperar">
                </form>
            <?php
        }
        else
        {
            echo "<h1>Pagina não encontrada</h1>";
        }
        ?>
    </div>
    </body>
</html>
R

Ele nao esta passando o valor chave como voce disse, eu vou tentar refazer essa parte
as vezes esqueci de algo e nao to vendo

L
Solucao aceita

Imagino que você está mandando a chave gerada por link, para o usuário clicar no email certo?

Verifique como está montando o link…

Você também pode usar var_dump nessa página, testando se o $_GET chegou corretamente…

Para testar se a chave está vazia, melhor usar a função empty…

if (!empty($_GET['chave']))
...

Dessa forma se a chave vier NULL, o formulário nem é exibido e cai no else…

R

voce tinha razao, eu tinha mandando montar o link, e por algum motivo que eu ainda nao descobri ele nao reconhecia a chave que era mandado
so que ao inves de dar um erro 404, ele mandava direto pra a pagina de para fazer a troca de senha, eu reescrevi o codigo exatamente como estava e dessa vez funcionou, so que quando eu montei um link passando assim Recovery.php?chave=’.$chave.’, a variavel $chave com um ponto na frente e outro atras e deu certo

kkkk
salvou minha vida outra vez
agora com menos um problema posso aproveitar esse fds e o feriado sem ficar pensando em script kkkkkkkk

valeu

L

Por padrão em qualquer página, dificilmente você terá um erro 404 por causa disso

?chave=’.$chave.’…

Tudo o que estiver no querystring (nome técnico para mandar parâmetros via get) são ignorados, 404 você recebe se errar alguma coisa antes do sinal de ?

Outra coisa, você disse usar ponto (operador de concatenação) para montar o link e deu certo, cuidado ao usar strings com aspas simples e duplas, pois há diferença em como o php entende…

Quando se usa aspas simples…

'texto com $variavel'

Você diz ao php que não existe nada para ser processado, logo ao invés de imprimir o valor, irá imprimir $variavel mesmo…

Já quando se usa aspas duplas…

"texto com $variavel"

Você diz ao php que existe algo a ser processado, logo ele irá ler o conteúdo e imprimir o valor ao invés de $variavel…

R

Eu tinha essa duvida mesmo, eu estava usando aspas simples no link todo, agora eu entendi porque não estava funcionando, foi um alívio quando deu certo. Agora vou entrar na parte de mas complicada, começar a fazer tabela para cadastrar coisas e cada usuário devera ter cadastros diferentes de forma que os cadastros de um usuário não interaja nem altere os cadastros do outro… :sob:

Criado 28 de abril de 2017
Ultima resposta 29 de abr. de 2017
Respostas 16
Participantes 2